main() {unsigned a=32768; printf("a=%d\n",a); } 为什么结果是:a=-32768
答案:2 悬赏:70 手机版
解决时间 2021-03-05 13:28
- 提问者网友:浩歌待明月
- 2021-03-05 10:21
main() {unsigned a=32768; printf("a=%d\n",a); } 为什么结果是:a=-32768
最佳答案
- 五星知识达人网友:我住北渡口
- 2021-03-05 10:48
unsigned a 默认为unsigned int a 范围为 65535
因此 你的溢出了
所以变成了 -32768
如果你把声明修改为signed int a 就会正确输出32768
VC之所以显示正确是因为它是32位编译器,int为4个字节,而
TC是一个16位编译器,int只有2个字节。
-----------------
此题是考整数的存储方式--二进制补码,你只要熟悉这,应该不难。
unsigned a=32768;
这是一个无符号格式存储的数,
32768=(1000 0000 0000 0000)2
而后面把它以%d格式(即十进制有符号)输出,此时它以负数形式输出。
而当把它当成是有符号时,此时(1000 0000 0000 0000)2是一个负数的补码,(有的书上称这为输出转换)
这就涉及负数的补码怎么求?
用负数的绝对值-> 原码-> 取反得到反码--> 再加1--> 补码,
所以由补码求原来的负数是上面的逆过程
(1000 0000 0000 0000)2--> 减1
(0111 1111 1111 1111)2 取反
(1000 0000 0000 0000)22 得到绝对值的原码,即为32768,所以输出转换为-32768
因此 你的溢出了
所以变成了 -32768
如果你把声明修改为signed int a 就会正确输出32768
VC之所以显示正确是因为它是32位编译器,int为4个字节,而
TC是一个16位编译器,int只有2个字节。
-----------------
此题是考整数的存储方式--二进制补码,你只要熟悉这,应该不难。
unsigned a=32768;
这是一个无符号格式存储的数,
32768=(1000 0000 0000 0000)2
而后面把它以%d格式(即十进制有符号)输出,此时它以负数形式输出。
而当把它当成是有符号时,此时(1000 0000 0000 0000)2是一个负数的补码,(有的书上称这为输出转换)
这就涉及负数的补码怎么求?
用负数的绝对值-> 原码-> 取反得到反码--> 再加1--> 补码,
所以由补码求原来的负数是上面的逆过程
(1000 0000 0000 0000)2--> 减1
(0111 1111 1111 1111)2 取反
(1000 0000 0000 0000)22 得到绝对值的原码,即为32768,所以输出转换为-32768
全部回答
- 1楼网友:三千妖杀
- 2021-03-05 11:39
虽然 a 和 b 定义为 unsigned,无符号整数,但是格式字符串是 "%d",属于 int 型的,所以仍然会输出有符号整数。
输出的结果会因系统和编译器而异。估计本题用的是 turbo c,int 是2个字符,16个位元,输出会是:
0,−32768
(如果在 int 是4个字符,32个位元的系统,就会输出:65536,32768)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯