【问题标题】:Will an Infinite Loop ever end by Itself无限循环会自行结束吗
【发布时间】:2017-06-11 09:14:41
【问题描述】:

假设我们有以下循环:

    for (int i = 1; i < 2; i--)
    {
        cout << i << endl;
    }

毫无疑问,这是一个无限循环。但是,我的问题是它会运行多长时间?因为我的教授说给定一个 int 是4 bytes = 32 bits,它可以存储来自-2147483648 to 2147483647 的数字。鉴于此,他接着说,在一个 for 循环中,如果它达到这些数字之一,并且循环仍然被编程为继续(就像这个一样),那么这个数字将变为正数,并且条件将满足,终止循环。

我的问题是:这是怎么发生的?为什么数字-2147483648在for循环中变成+2147483648,为什么+2147483648在for循环中变成-2147483648?因为我以前认为计数器一到 2147483649 就会出现分段错误。感谢您的回复!

【问题讨论】:

  • Without a doubt, this is an infinite for-loop ... 毫无疑问,这个循环甚至不会执行一次,因为循环条件i &gt; 2 永远不会为真。
  • 无限循环将是while(true) {}。但看起来你的问题实际上是关于整数算术,而不是循环。
  • @TimBiegeleisen 感谢您为我确认这一点。以为我在服用疯狂的药丸。
  • "-2147483648 变成 +2147483648" 真的很奇怪。我希望它变成+2147483647
  • 虽然答案是 Fox 先生所说的“谁知道?未定义的行为”,但常见的实现给出了一些关于可能发生的情况的提示。阅读Two's Compliment

标签: c++ for-loop segmentation-fault infinite-loop bits


【解决方案1】:

回答你的标题问题; Will an Infinite Loop ever end by Itself:

没有。

但是您的循环不仅不是无限的,而且由于 for 循环条件,它甚至不会运行一次。

for (int i = 1; i > 2; i--)

i, at 1 永远不会满足循环条件 i>2。

虽然你的意思是i &lt; 2,但答案是,我不知道。整数溢出是C++ (see here) 中未定义的行为。

在大多数情况下,它会环绕,但由于行为是未定义的,因此没有必要讨论真正会发生什么。

【讨论】:

    【解决方案2】:

    为什么+2147483647变成-2147483648

    如果您以位表示形式编写整数,这一点就会变得很明显。为简单起见,让我们取一个 8 位变量,如 char 或 std::int8_t。 一个 8 位类型可以保存 2^8 = 256 个不同的值。对于有符号变量,这些值是从 -128 到 127 的值(0 也是一个值,因此只能达到 127)。几个例子:

    0000 0000 = 0
    0000 0001 = 1
    0111 1111 = 127
    
    1111 1111 = -1
    1111 1110 = -2
    1000 0000 = -128
    

    例如,如果您计算 -1 + 2 = 1,您可以很容易地看到值 -1 需要为 1111 1111

      1111 1111
    + 0000 0010
      1111 11     (carry)    
      ---------
      0000 0001
    

    如果你增加值 0111 1111 = 127,你会得到 1000 0000 = -128。这正是您的情况所发生的情况,只是多了几位。

    然而正如 Fantastic Mr Fox 已经提到的那样,它是否真的环绕取决于编译器的实现,而不是由标准定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 2013-09-30
      • 2014-12-12
      • 1970-01-01
      • 2021-04-08
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多