无限循环会不会自行结束

Will an Infinite Loop ever end by Itself

本文关键字:结束 会不会 无限循环      更新时间:2023-10-16

假设我们有以下循环:

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

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

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

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

不。

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

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

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

假设你的意思是i < 2,那么答案是,我不知道。整数溢出是C++中未定义的行为(请参阅此处)。

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

为什么 +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 需要为 1111 1111,例如,如果您计算 -1 + 2 = 1

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

如果递增值 0111 1111 = 127,则得到 1000 0000 = -128。这正是你的情况,只是多了几点。

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