读书人

5000输出为-15536 数据溢出?求详解

发布时间: 2013-01-18 10:22:42 作者: rapoo

5000输出为-15536 ,数据溢出?求详解! 在线等,谢谢
int main(void)
{
short int i;
short unsigned int j;
j = 50000;
i = j;
cout<<i<<endl;
cout<<j<<endl;
return (0);
}

输出结果:
-15536
50000
50 000 的原码:1100 0011 0101 0000
15536 的原码:0011 1100 1011 0000
-15536 的原码:1011 1100 1011 0000

我知道 50 000 超过了有符号整数的表示范围所以溢出了,
我的理解1
如果我把50 0000的二进制原码理解为-15536在计算机中的补码
那么求出-15536的原码就是对“补码” 1100 0011 0101 0000求补,计算出来就是1011 1100 1011 0000, 即-15536的原码
我的理解2
如果将50 000 理解为二进制原码,那么求补就是-15536在计算机中的补码表示,即
对1100 0011 0101 0000 求补, 结果为1011 1100 1011 0000 正好是-15536的原码

cout<<i<<输出为 -15536 到底是根据哪个理解来的啊? 还是都不是啊? 请帮忙详细解释分析一下,谢谢啊 原码 补码 溢出
[解决办法]
无符号数50000的二进制是
1100 0011 0101 0000(原码补码相同,计算机中都是补码表示)
当把它强制转换成有符号数,则第一位变成了符号位
即-15536的补码
至于输出,因为i是有符号数,所以自然是输出-15536
你可以输出它的二进制来看一看,输出的是补码。
[解决办法]
你的理解1是应该是正确的,负数在计算机中是以补码的形式储存的。

读书人网 >C++

热点推荐