main() {unsigned a=32768; printf("a=%d\n",a); } 为什么结果是:a=-32768

 我来答
沧海雄风2009
2012-03-20 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8525
采纳率:79%
帮助的人:2832万
展开全部
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
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式