(c语言)整型数据的溢出

main(){
int a;
a = 32768;
printf("%d",a);
}
打印出来后,显示为:-32768
为什么啊?有符号位整型的最大为32768,溢出后为什么为-32768了?

其实这个问题很简单的,这个可能和你编译器环境有关,int 类型表示范围是-32768-32767。所以你可以把它的表示范围比作一个圆。因为在电脑中负数是按补码保存的,所以加1之后会出现进位。如果是char 类型表示-128-127的话,那么char a = 128也会变成-128的。

你可以看一下下面的图,这个圆就好比表示的范围。如果不信的话你可以将int a = 32769;试试的,输出应该会变成-32787

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-25
C语言的整型溢出,分为无符号整型溢出和有符号整型溢出。
对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。如:
1.unsigned char x = 0xff;

2.printf("%dn", ++x);
上面的代码会输出:0 (因为0xff + 1是256,与2^8求模后就是0)
对于signed整型的溢出,C的规范定义是“undefined behavior”,也就是说,编译器爱怎么实现就怎么实现。如:
1.signed char x =0x7f; //注:0xff就是-1了,因为最高位是1也就是负数了

2.printf("%dn", ++x);

上面的代码会输出:-128,因为0x7f + 0×01得到0×80,也就是二进制的1000 0000,符号位为1,负数,后面为全0,就是负的最小数,即-128。
第2个回答  2014-08-14
这个是计算机中的负数补码表示
假定有符号的最大值(二进制) 为0111...111 后面若干个1 当然 取决于计算机的位长度
增加1之后溢出的话 就成了 1000...000 这个时候符号位就变成了1 也就是会被判定为负数
然后再转换成十进制自然就是负数了本回答被网友采纳
第3个回答  2014-08-14

    你用的是16 bit的编译器吧,16bit的编译器的int范围是,32767 ~ -32768

    对于32 bit而言 int型,表示的范围是2147483647~-2147483648

请注意,最大范围是32767,不是32768;

32768的最高bit是1,1就表示负数

32768 --> 0x8000 = -32768

第4个回答  2014-08-14
有符号位整型的最大为32767吧
相似回答