Для цикла прослушивается?

Я сделал цикл для расчета численности популяции чужеродных видов. Это цикл:

int mind = 96;
int aliens = 1;
for (int i=0; i <= mind; i++)
{
    aliens = aliens * 2; 
}
cout << aliens;

Как ни странно, cout возвращается 0и это не имеет смысла, оно должно возвращать очень высокое значение. Цикл плохо закодирован?

1 ответ

Решение

Вопрос прост. у тебя есть int (скорее всего 32-разрядное целое число со знаком). Операция, которую вы выполняете (х2 каждый цикл), может быть выражена как арифметика сдвига влево. Остерегайтесь силы 2! Выполнение 1 << 31 для 32-разрядного целого числа со знаком фактически вернется к 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 бит длиной

Другие вопросы по тегам