众所周知,最小的整数因编译器而异,所以我有这样一个问题:当你使用各种编译器时,(int)-2147483648
除以(int)-1
的结果是什么?例如,VC6.0,VS2010等?
答案 0 :(得分:1)
首先让我们假设我们处于32-bit
系统中,其中INT_MIN
值与-INT_MAX - 1
相同。
这个表达式:
(int) -2147483648 / (int) -1
相当于
(int) -2147483648 / -1
因为-1
已经是int
类型。
在32-bit
二位补码系统INT_MAX
为2147483647
时,值2147483648
的类型为long
1)因为它无法在int
中表示。 -2147483648
的值也是long
类型。
long
值-2147483648
可以在int
中表示,而(int) -2147483648
整数转换后的值为INT_MIN
。
然后原始表达式(在我们的假设下)等同于:
INT_MIN / -1
此表达式相当于INT_MAX + 1
,int
无法表示int
。确实INT_MIN
类型范围从INT_MAX
到LONG_MAX
。表达式是整数溢出,整数溢出在C中调用未定义的行为。
(C99,6.5p5)“如果在评估表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义。 “
<小时/> <子>
1)我们隐含地假设> INT_MAX
是2147483648
,否则值long long
的类型为{{1}}。