无限循环会自行结束吗
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 已经提到的,它是否真的环绕取决于编译器的实现,而不是由标准定义的。
假设我们有以下循环:
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 已经提到的,它是否真的环绕取决于编译器的实现,而不是由标准定义的。