无限循环会自行结束吗

Will an Infinite Loop ever end by Itself

假设我们有以下循环:

    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就会出现段错误。感谢您的回复!

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

没有

但是你的循环不仅 不是 无限的,它甚至不会 运行 因为 for 循环条件。

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

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

假设您的意思是 i < 2,那么答案是,我不知道。整数溢出是 C++ (see here) 中的未定义行为。

在大多数情况下它会回绕,但由于行为未定义,因此讨论真正发生的事情没有意义。

why does +2147483647 turn to -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 已经提到的,它是否真的环绕取决于编译器的实现,而不是由标准定义的。