for (i = 0; i <= N; ++i) { ... }
如果 N 为 ,则此特定语句将导致无限循环INT_MAX
。知道无符号溢出正在包装溢出,假设i
和N
无符号,编译器可以假设如果溢出时未定义,则循环将准确地迭代N+1
次数。i
这里要注意的是:如果我将循环设为,
for (i = 0; i < N; ++i) { ... }
这仍然是未定义的行为吗?
为什么在有符号整数的情况下INT_MAX + 1
不一定等于?INT_MIN
INT_MAX + 1
此操作调用未定义的行为。有符号整数溢出是 C 中未定义的行为。
它可能导致INT_MIN
或者实现可以认为这个表达式是肯定的,或者程序可能会崩溃。不要让可移植程序计算这个表达式。
Why INT_MAX + 1 is not surely equal to INT_MIN in case of signed integers?
首先,C 标准未定义整数溢出的行为。大多数实现似乎让数字只是默默地溢出,所以让我们假设是这种情况。
其次,C 标准不假定二进制补码整数。大多数平台都使用它,尤其是较新的平台。有(曾经)使用其他整数表示的旧平台,例如one's complement。补码溢出导致负零。
依赖未定义的行为以任何特定方式工作是非常糟糕的编程实践,因为它使程序的可移植性大大降低。甚至操作系统或编译器升级也可能会改变未定义的行为,因此它甚至可能无法在同一操作系统的不同版本之间移植。