【问题标题】:Is INT_MAX+1 = INT_MIN in signed integer? [duplicate]INT_MAX+1 = INT_MIN 是有符号整数吗? [复制]
【发布时间】:2013-10-15 08:38:58
【问题描述】:
for (i = 0; i <= N; ++i) { ... }

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

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

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

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

【问题讨论】:

  • 因为 C 中的位溢出是未定义的行为

标签: c unsigned signed


【解决方案1】:

INT_MAX + 1

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

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

【讨论】:

    【解决方案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。补码溢出导致负零。

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

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      相关资源
      最近更新 更多