为什么这个设计还会出现整形数据溢出?

来源:百度知道 编辑:UC知道 时间:2024/06/23 23:45:35
main()
{
int a; long int b;
a=32767;
b=a+1;
printf("%d,%d\n",a,b);
}
b已经是长整形了,可以表示正负2147483648那么多的位数,可结果turbo c 3.0却显示32767,-32768。
printf("%d,%ld\n",a,b);没用,还是32767,-32768
然后我再试:
main()
{
long int a;
long int b;
a=32767;
b=a+1;
printf("%d,%d\n",a,b);
getch();
}
这回ab都长整型,结果还不能如愿。按理应显示32767,32768,却显示32767,0

下面是《The C Puzzle Bokk》对赋值表达式的解释:

赋值表达式的值是“=”右边的值,类型是“=”左边的变量的类型。所以b=a+1的值是(a+1)而类型是(double),这个表达式是先执行a+1,然后再将值赋给b,这个你肯定是知道的。
TC中的int是16位,可表示的最大正整数是65535,它等于0,111,111,111,111,111,对其加1的结果是1,000,000,000,000,000,由于在Intel机器上最高为的1表示负数,所以以十进制表示就是-32768。
这一题在GCC下不会溢出。

int型加1,还是int型,
b=a+1,要先算出a+1的值然后才给赋给b
a是int型,所以a+1的值仍然是int型,益出,为-32768,再把这个值赋给b.
补充:
printf里的改成ld了吗?

printf("%d,%ld\n",a,b);
楼下解释的对。
b = (long)a + 1;