众所周知,最小整数因编译器而异,所以我有一个疑问:使用各种编译器,(int)-2147483648
除以得到什么结果?(int)-1
比如VC6.0、VS2010等?
问问题
353 次
1 回答
1
首先让我们假设我们处于一个32-bit
具有二进制补码表示的系统中,其中INT_MIN
value 与 相同-INT_MAX - 1
。
这个表达式:
(int) -2147483648 / (int) -1
相当于
(int) -2147483648 / -1
-1
已经是 type了int
。
在is32-bit
的二进制补码系统中,值的类型为1),因为它不能在 中表示。的值也是 type 。INT_MAX
2147483647
2147483648
long
int
-2147483648
long
long
值-2147483648
可以用 表示,整数int
转换后的(int) -2147483648
值为INT_MIN
。
原始表达式(在我们的假设下)等价于:
INT_MIN / -1
并且这个表达式等价于INT_MAX + 1
which 在 an 中不可表示int
。事实上int
,类型范围从INT_MIN
到INT_MAX
。该表达式是一个整数溢出,整数溢出调用 C 中未定义的行为。
(C99, 6.5p5) “如果在计算表达式期间出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义。”
1) 我们隐含地假设LONG_MAX
is > INT_MAX
,否则该值为2147483648
type long long
。
于 2012-12-28T16:36:47.833 回答