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
?
答案 0 :(得分:5)
INT_MAX + 1
此操作调用未定义的行为。有符号整数溢出是C中未定义的行为。
它可以导致INT_MIN
或者实现可以认为该表达式为正或者程序可能崩溃。不要让便携式程序计算这个表达式。
答案 1 :(得分:2)
Why INT_MAX + 1 is not surely equal to INT_MIN in case of signed integers?
首先,C标准未定义整数溢出的行为。 大多数实现似乎让数字只是静默地溢出,所以让我们假设是这种情况。
其次,C标准不假设twos's complement整数。大多数平台使用它,尤其是较新的平台。有些旧平台使用其他整数表示,例如one's complement。一个补码中的溢出导致负零。
依赖于未定义的行为以任何特定的方式工作是非常糟糕的编程习惯,因为它使程序的可移植性降低。即使是操作系统或编译器升级也可能会改变未定义的行为,因此它甚至可能无法在同一操作系统的不同版本之间移植。