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

来源:百度知道 编辑:UC知道 时间:2024/09/24 22:11:40
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调用再取了更后面的数据。
-------