-2

众所周知,最小整数因编译器而异,所以我有一个疑问:使用各种编译器,(int)-2147483648除以得到什么结果?(int)-1比如VC6.0、VS2010等?

4

1 回答 1

1

首先让我们假设我们处于一个32-bit具有二进制补码表示的系统中,其中INT_MINvalue 与 相同-INT_MAX - 1

这个表达式:

(int) -2147483648 / (int) -1

相当于

(int) -2147483648 / -1

-1已经是 type了int

在is32-bit的二进制补码系统中,值的类型为1),因为它不能在 中表示。的值也是 type 。INT_MAX21474836472147483648longint-2147483648long

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

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

INT_MIN / -1

并且这个表达式等价于INT_MAX + 1which 在 an 中不可表示int。事实上int,类型范围从INT_MININT_MAX。该表达式是一个整数溢出,整数溢出调用 C 中未定义的行为。

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


1) 我们隐含地假设LONG_MAXis > INT_MAX,否则该值为2147483648type long long

于 2012-12-28T16:36:47.833 回答