谁能给我解释一下这个C语言题目啊??

sdkwjc 2013-04-21 11:59:06
short int a=32769;
cout<<a<<endl;
system("pause");
return 0;


输出结果为什么是-32767????麻烦稍微详细点啊,,,感谢!!
...全文
230 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
winassembly 2013-04-23
  • 打赏
  • 举报
回复
楼主太客气了。也谢谢楼主的分!
sdkwjc 2013-04-23
  • 打赏
  • 举报
回复
引用 6 楼 howard58888 的回复:
引用 4 楼 winassembly 的回复:正如楼上所说,short int的范围是[-32768,32767],当超出范围时,会产生环绕现象。另外,你可以把32769转换成二进制是1000000000000001,而在计算机中任何数都是以补码形式存储的,当最高位是1时,计算机把它理解为负数,所以1000000000000001是一个负数的补码,将其转换成原码(除最高符……
很好,感谢
sdkwjc 2013-04-23
  • 打赏
  • 举报
回复
引用 4 楼 winassembly 的回复:
正如楼上所说,short int的范围是[-32768,32767],当超出范围时,会产生环绕现象。另外,你可以把32769转换成二进制是1000000000000001,而在计算机中任何数都是以补码形式存储的,当最高位是1时,计算机把它理解为负数,所以1000000000000001是一个负数的补码,将其转换成原码(除最高符号位外,其他各位取反再加1)得11111111……
回答的非常好,感谢
sundq12 2013-04-21
  • 打赏
  • 举报
回复
short int的范围是[-32768---32767]
半醉看夕阳 2013-04-21
  • 打赏
  • 举报
回复
你赋的值,超出了int型所能表示的范围了
wizard_tiger 2013-04-21
  • 打赏
  • 举报
回复
short表示范围太小,溢出了。
winassembly 2013-04-21
  • 打赏
  • 举报
回复
对于负数补码转换成原码,6楼说的是一种方法,我说的是另一种方法。都可以成功转换。
winassembly 2013-04-21
  • 打赏
  • 举报
回复
对6楼的说法做个澄清: 1:负数补码转换成原码可以用我所说的方法:除最高位(符号位)外,其它各位取反再加1; 2:unsigned short int与short int同样用2个字节存储,但前者把最高位也看成是数值本身,所以可以存储32769这一数值; 3:按我的方法将32769的机器码1000 0000 0000 0001转换成原码即是1111 1111 1111 1111,用十进制表示就是-32767.
Code研究者 2013-04-21
  • 打赏
  • 举报
回复
负数原码->补码是除符号位外,各位取反加1,负数补码->原码
Code研究者 2013-04-21
  • 打赏
  • 举报
回复
引用 4 楼 winassembly 的回复:
正如楼上所说,short int的范围是[-32768,32767],当超出范围时,会产生环绕现象。另外,你可以把32769转换成二进制是1000000000000001,而在计算机中任何数都是以补码形式存储的,当最高位是1时,计算机把它理解为负数,所以1000000000000001是一个负数的补码,将其转换成原码(除最高符号位外,其他各位取反再加1)得11111111……
楼4说的有问题,负数原码->反码是除符号位外,各位取反加1,负数反码->原码,取符号位外减1,再取反 1:32769转换成机器码后为1000 0000 0000 0001 2:unsigned int 占2个字节 16bit 3:输出时16为1即为负数,1000 0000 0000 0001由补码转换成原码即减1成1000 0000 0000 0000,再求反即 1111 1111 1111 1111 故为-32767
derekrose 2013-04-21
  • 打赏
  • 举报
回复
引用 2 楼 xiaoliang1201 的回复:
楼上正解,超过了short类型的表示范围了。
++
winassembly 2013-04-21
  • 打赏
  • 举报
回复
正如楼上所说,short int的范围是[-32768,32767],当超出范围时,会产生环绕现象。另外,你可以把32769转换成二进制是1000000000000001,而在计算机中任何数都是以补码形式存储的,当最高位是1时,计算机把它理解为负数,所以1000000000000001是一个负数的补码,将其转换成原码(除最高符号位外,其他各位取反再加1)得11111111111111111,这个二进制表示的十进制数就是-32767. 究其原因在于short int在您的系统中是用2个字节存储的(即16位),32769超出了short int所能存储的数的范围(即用16位已经存储不下了),而计算机并不知道,它只是忠实地按它的方式将16位的值翻译成了-32767. 解决这一问题的办法就是用更多的存储空间来存储这一数值,如将其声明为long类型或unsigned short int类型,亦或是int(如果您的计算机中int的存储空间比short int的存储空间更大)。
lin5161678 2013-04-21
  • 打赏
  • 举报
回复
有符号数溢出 结果不可靠
xiaoliang1201 2013-04-21
  • 打赏
  • 举报
回复
楼上正解,超过了short类型的表示范围了。

70,004

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧