无限循环是否会自己结束

时间:2017-01-26 00:52:51

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

我们假设我们有以下循环:

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

2 个答案:

答案 0 :(得分:5)

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

没有

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

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

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

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

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

答案 1 :(得分:2)

  

为什么+2147483647转向-2147483648

如果以位表示形式写入整数,这就变得很明显了。为了简单起见,我们采用像char或std :: int8_t这样的8位变量。 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。这正是你的情况下发生的事情,只是多了几点。

然而,正如福克斯先生已经提到过的那样,它是否真的包装是依赖于编译器实现而不是由标准定义。