c语言溢出问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 06:46:06
A、#include
void main()
{
short a,b;
a=32767;
b=a+1;
printf("a=%d,b=%d\n",a,b);
}

short取值范围:-32768-32767

输出结果为:
a=32767;b=-32768;

B、#include
void main()
{
unsigned short a=65536;
int b;
printf("%d\n",b=a);
}

unsigned shord取值范围:0-65535;

输出结果为:0

我有点不明白,为什么A结果和B结果有这么大的差距啊,
到底溢出是怎么回事啊,
为什么A溢出是负数,而B溢出是0啊?
不太明白,能讲讲吗???

你就把取值范围理解成一个圆圈,
short取值范围:-32768-32767
超过了32767(最大数),就绕一圈到-32768(最小数),
再从最小数开始往上加;

unsigned shord取值范围:0-65535;
超过了65535,绕一圈到0
就是这样了,这样理解简单一些

这个你要看看补码和原码,反码的资料了.
有符号数是用补码表示的,
32767=0111 1111 1111 1111
0111 1111 1111 1111+1=1000 0000 0000 0000=-32768
1000 0000 0000 0000是补码,换为10进制数就是-32768了
无符号数用原码表示
65535=1111 1111 1111 1111
1111 1111 1111 1111 +1=1 0000 0000 0000 0000=0(最高位溢出舍去了,只保留16位)
你可以理解为那个范围其实是一个环形的,最大的加1就为最小的.呵呵

shot是两个字节,最高位是表示符号的,你可以自己算一下为什么它的取值范围是那样的。另外你还要知道负数的表示。
32767加一后写成二进制是什么?它正好是-32768在计算机中的表示,现在你是不是有点了解了呢?