嘲讽的单词:关于c语言整型数据的溢出问题~~求高手多指点~~

来源:百度文库 编辑:高校问答 时间:2024/05/10 07:42:16
先谢谢各位~~~

main()
{
int a,b;
a=32767;
b=a+1;
printf ("%d,b");
}
结果为 -32768 对这个结果我有点不明白的地方还望高手能点指点

a=32767 他在内存中的存储形式为 011111111111111 它的从左数第一位的0为符号位
b=a+1 他在内存中的存储形式为 100000000000000 那么此时他的左数第一位的1是符号位还是值
如果为符号位的话 00..00为其值的补码 此值为0 那么结果为什么还是 -32768呢

我就是这点不太明白,就是说一个数占8位,头一位用来存放“正负号”,那么对于正整数来说头一位必须为0,那么表示其值的只有7位;对于负整数而言,第一位必为1,那么表示其值的是8位还是7位就是说这是既表示“负号”有表示数值,还是。。。请高手给指点指点 非常感谢

对于整数,反码,补码与原码相同。
对于负数,补码是原码的符号位不变,数值部分按位取反再加1。
知道负数补码,可以对改补码再一次求补码,就可以得到原码。

假设你是16位系统。
100000000000000 求补=1 11111111111111+1=00..00
b就溢出为0了。

不过现在都是32位系统了,int类型都是4个字节的都,a表示成00..00100000000000000了。
楼主的的这个程序不能造成溢出。
所以printf ("%d",b);打印出来的b应该是32768,也不是 -32768

0是0000…00啊,开头是1了,后面是补码,所以就当是-(11…1+1)=-1000000…0,是-32768。
记住负数的补码等于该负数的反码与末位加1