【发布时间】:2017-11-27 02:19:59
【问题描述】:
根据link,执行 INT_MIN / -1 除法运算将导致程序在 i386 CPU 中终止。我的处理器是 32 位架构的,我使用 GCC 编译器。我做了以下实验来检查它。
int a = INT_MIN;
int b = -1;
int c = a / b;
printf("%d\n",c);
根据上面提到的链接中指定的信息,该程序被终止并抛出一个浮点异常。但是当我以不同的方式尝试时,情况就不一样了。
int c = INT_MIN / -1;
printf("%d\n",c);
编译器在编译此程序后抛出以下警告。
iso.c:在函数'main'中:
iso.c:6:18:警告:表达式中的整数溢出 [-Woverflow]
int c = INT_MIN / -1;
_____________^
但我得到了输出 -2147483648。我又做了两个实验。
int a = INT_MIN;
int b = -1;
printf("%d\n",a / b);
这是一个浮点异常。
printf("%d\n",INT_MIN / -1);
这引发了以下编译器警告。
iso.c:在函数'main'中:
iso.c:6:24:警告:表达式中的整数溢出 [-Woverflow]
printf("%d\n",INT_MIN / -1);
__________________^
这个程序的输出又是-2147483648。
在做了所有这些实验之后,我注意到直接对常量进行除法运算的结果与对变量进行除法运算的结果不同。那么究竟是什么造成了这种差异呢?
【问题讨论】:
-
编译器可能很聪明,并认识到这部分
int a = INT_MIN; int b = -1; int c = a / b;可以由编译器完成,而不是由CPU完成,因此您在运行程序时已经有了结果,甚至没有执行除法。另一方面,如果除法前变量值未知(scanf为输入读取值),则肯定会进行除法指令。
标签: c variables gcc constants integer-division