C语言数值溢出了会怎么样?

来源:百度知道 编辑:UC知道 时间:2024/06/17 19:10:00
int i;
long j;
i=1000;
j=i*100;
printf("%ld\n",j); <1>
j=i*100l;
printf("%ld\n",j); <2>
为什么<1>号处的j值是-31072
我用的是TC2.0,这是书上的一道题,叫我写出运行结果,并分析原因。 我用VC试了试,两个都是100000,真是奇怪了。

我想那道题的本意是告诉读者数字常量(100)加与不加后缀l的区别。

加l编译器把常量做为long型,不加则做为int型。

题目可能假设:
1. int是16位
2. long是32位
3. int型乘法结果保存在16的寄存器中
4. long型乘法结果保存在32寄存器中。

因此这个实验在一般32位机的VC下是会成功的:
1. 当前PC下int是32位的值,完全可以容纳100000这么个数字,所以加与不加完全相同。
2. long在VC下一般也是32位,仅通过改变做乘法的数字的大小来做实验是行不通的,因为结果不管是否溢出都会相同。
3. 把i声明为short(16位),这样i和j的位数就不相同了,同时做乘法时用i*(short)100,但也行不通,因为不管什么类型的乘法的结果都是存储在32(或更高)位寄存器中的。

也就是说对后缀l的实验暂时没法做了,因为要满足:
1. 两个不同范围的数据类型(可满足)
2. 不同数据类型的结果存储在不同大小的寄存器中。(很难满足)

我想你想看结果,只能用(short)(i*100)来做了。

short i;
long j;
i=1000;
j=(short)(i*100);
printf("%ld\n",j);
j=i*100l;
printf("%ld\n",j);

return 0;

应该是int和long不匹配的问题。你把j定义称int 型,或者把i定义称long型就可以解决了。

你用的什么编译器?我用VC++ 结果很正常