2
for (i = 0; i <= N; ++i) { ... }

如果 N 为 ,则此特定语句将导致无限循环INT_MAX。知道无符号溢出正在包装溢出,假设iN无符号,编译器可以假设如果溢出时未定义,则循环将准确地迭代N+1次数。i这里要注意的是:如果我将循环设为,

for (i = 0; i < N; ++i) { ... }

这仍然是未定义的行为吗?

为什么在有符号整数的情况下INT_MAX + 1不一定等于?INT_MIN

4

2 回答 2

7

INT_MAX + 1

此操作调用未定义的行为。有符号整数溢出是 C 中未定义的行为。

它可能导致INT_MIN或者实现可以认为这个表达式是肯定的,或者程序可能会崩溃。不要让可移植程序计算这个表达式。

于 2013-10-15T08:40:53.757 回答
2
Why INT_MAX + 1 is not surely equal to INT_MIN in case of signed integers? 

首先,C 标准未定义整数溢出的行为。大多数实现似乎让数字只是默默地溢出,所以让我们假设是这种情况。

其次,C 标准不假定二进制补码整数。大多数平台都使用它,尤其是较新的平台。有(曾经)使用其他整数表示的旧平台,例如one's complement。补码溢出导致负零。

依赖未定义的行为以任何特定方式工作是非常糟糕的编程实践,因为它使程序的可移植性大大降低。甚至操作系统或编译器升级也可能会改变未定义的行为,因此它甚至可能无法在同一操作系统的不同版本之间移植。

于 2013-10-15T08:54:33.357 回答