C语言数值溢出了会怎么样?
发布网友
发布时间:2023-10-17 01:34
我来回答
共3个回答
热心网友
时间:2024-02-11 23:57
我想那道题的本意是告诉读者数字常量(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;
热心网友
时间:2024-02-11 23:58
应该是int和long不匹配的问题。你把j定义称int 型,或者把i定义称long型就可以解决了。
热心网友
时间:2024-02-11 23:58
你用的什么编译器?我用VC++ 结果很正常