对于循环窃听?
For cycle bugged?
我做了一个for循环来计算一个外来物种的种群增长。这是循环:
int mind = 96;
int aliens = 1;
for (int i=0; i <= mind; i++)
{
aliens = aliens * 2;
}
cout << aliens;
奇怪的是,cout
是 returning 0
,这是没有意义的,它应该 return 一个非常高的值。周期编码错误吗?
问题很简单。你有一个 int
(很可能是 32 位有符号整数)。您正在执行的操作(每个循环 x2)可以表示为 左移算术 。
当心2的幂!对 32 位有符号整数执行 1 << 31 将有效地返回到 0(在溢出后)。
让我们看看你的循环是如何进行的。
0 2
1 4
2 8
3 16
4 32
5 64
6 128
7 256
8 512
9 1024
10 2048
11 4096
12 8192
13 16384
14 32768
15 65536
16 131072
17 262144
18 524288
19 1048576
20 2097152
21 4194304
22 8388608
23 16777216
24 33554432
25 67108864
26 134217728
27 268435456
28 536870912
29 1073741824
30 -2147483648 // A.K.A. overflow
31 0
在这一点上我想我不需要告诉你0 x 2 = 0
重点是:使用至少 mind + 1
位长
的双精度或整数变量
我做了一个for循环来计算一个外来物种的种群增长。这是循环:
int mind = 96;
int aliens = 1;
for (int i=0; i <= mind; i++)
{
aliens = aliens * 2;
}
cout << aliens;
奇怪的是,cout
是 returning 0
,这是没有意义的,它应该 return 一个非常高的值。周期编码错误吗?
问题很简单。你有一个 int
(很可能是 32 位有符号整数)。您正在执行的操作(每个循环 x2)可以表示为 左移算术 。
当心2的幂!对 32 位有符号整数执行 1 << 31 将有效地返回到 0(在溢出后)。
让我们看看你的循环是如何进行的。
0 2
1 4
2 8
3 16
4 32
5 64
6 128
7 256
8 512
9 1024
10 2048
11 4096
12 8192
13 16384
14 32768
15 65536
16 131072
17 262144
18 524288
19 1048576
20 2097152
21 4194304
22 8388608
23 16777216
24 33554432
25 67108864
26 134217728
27 268435456
28 536870912
29 1073741824
30 -2147483648 // A.K.A. overflow
31 0
在这一点上我想我不需要告诉你0 x 2 = 0
重点是:使用至少 mind + 1
位长