![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
main() {unsigned a=32768; printf("a=%d\n",a); } 为什么结果是:a=-32768
展开全部
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询