(int)-2147483648的结果除以(int)-1,使用不同的编译器?

时间:2012-12-28 13:49:06

标签: c++ c compiler-construction integer

众所周知,最小的整数因编译器而异,所以我有这样一个问题:当你使用各种编译器时,(int)-2147483648除以(int)-1的结果是什么?例如,VC6.0,VS2010等?

1 个答案:

答案 0 :(得分:1)

首先让我们假设我们处于32-bit系统中,其中INT_MIN值与-INT_MAX - 1相同。

这个表达式:

(int) -2147483648 / (int) -1

相当于

(int) -2147483648 / -1

因为-1已经是int类型。

32-bit二位补码系统INT_MAX2147483647时,值2147483648的类型为long 1)因为它无法在int中表示。 -2147483648的值也是long类型。

long-2147483648可以在int中表示,而(int) -2147483648整数转换后的值为INT_MIN

然后原始表达式(在我们的假设下)等同于:

INT_MIN / -1

此表达式相当于INT_MAX + 1int无法表示int。确实INT_MIN类型范围从INT_MAXLONG_MAX。表达式是整数溢出,整数溢出在C中调用未定义的行为。

  

(C99,6.5p5)“如果在评估表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义。 “

<小时/> <子>

1)我们隐含地假设> INT_MAX2147483648,否则值long long的类型为{{1}}。