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

2024-11-20 07:31:22
推荐回答(2个)
回答1:

关于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++的回答,会令你受益匪浅

回答2:

数据存储到内存是按照2进制存储的
int型只能保存32位(二进制),如果超出了就会把前边的溢出了,就是保留后边的,前边的扔掉了
具体的还要涉及到正数和负数的问题,有符号的话,第一位是表示符号的