永发信息网

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

答案:2  悬赏:70  手机版
解决时间 2021-03-05 13:28
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
全部回答

虽然 a 和 b 定义为 unsigned,无符号整数,但是格式字符串是 "%d",属于 int 型的,所以仍然会输出有符号整数。

 

输出的结果会因系统和编译器而异。估计本题用的是 turbo c,int 是2个字符,16个位元,输出会是:

0,−32768

 

(如果在 int 是4个字符,32个位元的系统,就会输出:65536,32768)

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
成语玩命猜坐下有一针立着
高中毕业上的自考本科学的软件工程,毕业后好
当木材细胞腔内的自由水全部蒸发,吸附在细胞
17款迈腾现在值得买吗
红星批发商店在什么地方啊,我要过去处理事情
梦幻西游股票到底是在什么情况下才赚钱的。
我真的服了 贷款的说系统拒绝了 连人工电话审
无军籍退休职工不按管理办法安置怎样投诉
旺兴服饰地址在哪,我要去那里办事
雪缇雅波尿酸原液适合红血丝的皮肤吗
从本文看,商鞅变法成功的原因是什么?孝公既用
贵州到泉州的距离是多少
冰箱在接通电源的情况下,不放任何东西可以吗
想知道: 长沙市 长沙苏宁电器城分布 在哪
龙德盛园林绿化工程服务有限公司地址在什么地
推荐资讯
有颗心是什么成语
2014电信wifi登陆帐号与密码
(15分)【近代社会的民主思想与实践】材料一
为什么信阳山清水秀?
永泰生鲜超市这个地址在什么地方,我要处理点
在夫妻吵架时作为男性你会打你老婆吗?
下列均为呼吸系统的组成器官,其中呼吸系统的
朝北鼻怎么进化
单位新来同事虚头巴脑的,招人恨,怎么对付他
为什么我的网页可以搜索到点了进不去呢?
最近很嗜睡是怎么回事?
300左右价位的游戏方向盘 什么牌子的 哪种型
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?