C语言关于整型数据溢出的问题

main()
{
long a,b;
a=32767;
b=a+1;
printf("%ld\n%ld",a,b);
}
输出结果:
35676
35678
正常

替换为:printf("%d\n%ld",a,b);
输出结果:
32767
-2147483648
第二个数据明显溢出了,表示上是符合的
继续替换:
printf("%d\n%ld\n%d",a,b);
输出结果:
32767
-2147483648
0
再换:printf("%d\n%ld\n%ld",a,b);
输出结果:
32767
-2147483648
2147418112

以上结果希望从printf取数据打印规则和数据储存的角度加以解释,谢谢
yyrryyrr2 你的说明很详细 还有一处没理解

a,b均为long 第二次取%ld数据时候 b应有补码 为何取了main的局部变量

关于long型在计算机内存储方式,参看:
http://zhidao.baidu.com/question/112869407.html
yyrryyrr2的回答

-----------------------------------------------------
printf("%d\n%ld",a,b);中
printf将"%d\n%ld",a及b依次压入栈中
printf内部的可变参数分解函数从栈中取出数据替代%d,
依你的输出结果你用的是16位编译器。
栈从低地址到高地址数据为:
地址(假设) 数据
0xf000 0x3000(指向("%d\n%ld")
0xf002 0x7fff(即32767)
0xf004 0x8000 (即32768)
0xf006 0x????(此处为main函数的局部变量)
那么printf首先接受一个16位的int型,取出0x7fff调用_itoa将其转化成数字字符并替换%d。
然后printf需要取出一个32位long型数据,从0xf004处,可是你只给入了一个16值,所以取出的32位值包含垃圾信息(有16位是main函数的局部变量或垃圾信息),是0x8000????形式,而实际上????处恰好包含了0x0000(这点从你第二个printf调用即可看出,后一堆垃圾数据是0x0000),所以最终输出数字0x80000000即-2147483648

对后两个printf的分析类似
第二个调用虽然传入两个可变参数,但是由于有3个%d,所以前两个取出后,继续从栈上取数据,取出了main的栈桢的数据0x0000
最后一个printf调用再取了更后面的数据。
--------------------------------------------------
楼主喜欢探究问题的根源。
你可以翻看我的百度回答关于c/c++的回答,会令你受益匪浅
温馨提示:内容为网友见解,仅供参考
第1个回答  2020-02-06
数据存储到内存是按照2进制存储的
int型只能保存32位(二进制),如果超出了就会把前边的溢出了,就是保留后边的,前边的扔掉了
具体的还要涉及到正数和负数的问题,有符号的话,第一位是表示符号的

对于c语言中的整型数据溢出问题怎么办?
讨论的前提是int为32位,表示最大数为2147483647,足以表示11111、111111和111111111(5个、6个、9个1)。这三个常量的类型都是int。乘法结果的类型也是int,不会发生其他转换。然而,有符号整数运算发生溢出会产生未定义行为,非无符号整数存在此问题。11111 * 11111 = 123454321,值为int类型,而111111...

关于c语言整型数据的溢出问题~~求高手多指点~~
对于整数,反码,补码与原码相同。对于负数,补码是原码的符号位不变,数值部分按位取反再加1。知道负数补码,可以对改补码再一次求补码,就可以得到原码。假设你是16位系统。100000000000000 求补=1 11111111111111+1=00..00 b就溢出为0了。不过现在都是32位系统了,int类型都是4个字节的都,a表示...

C语言关于整型数据溢出的一个问题请教
long 型数据要加附加格式说明符 l 。输出的格式:printf("%ld,%ld",a,b);注意,2个数都是用"%ld"格式输出,否则可能会得到意外的结果。你可以试试用下面的几个语句依次替换printf(“%d,%d”,a,b);1.printf("%d,%ld",a,b);2.printf("%d\\n",a);printf("%d\\n",b);3.printf("%ld\\...

C语言中的int整型溢出是怎么回事?
从C语言的内部处理机制来说,int型数超出范围(溢出)被认为是一个正常现象,只会产生错误的计算结果或逻辑错误,而不会触发数据溢出的异常。因此,为了避免因为整数溢出而产生程序逻辑或计算错误,程序员必须自行检测可能出现的溢出或者确保不会出现数据溢出的情况。C语言对于int类型数据超出范围的处理,只有一...

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

C语言整型溢出会怎样
C语言的整型溢出,分为无符号整型溢出和有符号整型溢出。对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。

在C语言中,何为整型数的溢出?位操作符和移位操作符又是什么?
对于溢出上面的回答就行,补充一些,根据不同的机器(不同位宽)占的位宽也是不同的。不一定都是32。另外关于溢出:假如现在我的空间只有4位2进制(以下补码和符号不考虑,工作起来都一样)也就是我只能表示0000到1111(也就是0-15)的数据 如果我现在已经存了1111这么样一个数据,可是系统又要给它+...

C语言什么时候整型数据溢出会变成0?
整形就是int型,上溢就是从最大正数变成最大负数 但是如果是unsigned的时候,最大值上溢就变成0了。

C语言数据溢出时的值是负值吗
数据溢出分为上溢出和下溢出两种情况。另外数据存储在变量里时与变量的数据类型密切相关。所以溢出现象要分类讨论。例如,unsigned int型或unsigned short型或unsigned char型变量在上溢出时,将舍去超范围数据,其值仍然为正。附上测试程序:include <stdio.h> void main(void){ unsigned char j=255;j...

c语言溢出问题,求解答。请详细解释。
但对于a+1和b+1来说,编译器会自动把a,b都提升成长整型来进行计算,长整型是32位,32768在其范围内,不会溢出。所以a+1=32768是正确的。而b的值在定义时就已经是10000000 00000000,被提升为长整型时,因为最高位符号位是1,所以补为长整数时,左边补了16个1,变成11111111 11111111 10000000 ...

相似回答