有符号整数中的INT_MAX + 1 = INT_MIN吗?

时间:2013-10-15 08:38:59

标签: c unsigned signed

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

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

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

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

在签名整数的情况下,为什么INT_MAX + 1不一定等于INT_MIN

2 个答案:

答案 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。一个补码中的溢出导致负零。

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