В примере программы для распечатки степеней от 2 до максимально возможного целочисленного значения я сталкиваюсь с запутанным результатом.
Целочисленные переменные подписаны, поэтому для знака используется старший бит. На моей машине размер целого числа составляет 4 байта, то есть 32 бита. Я ожидал, что максимально возможное целочисленное значение будет 2 ^ 31.
Смущает меня следующее:
Максимальное целочисленное значение, которое я могу вычислить, равно 2 ^ 30.
Результат показывает, что 2 ^ 31 является минимальным целочисленным значением, а не максимальным.
Более того, 2 ^ 32 должно превышать максимальное целочисленное значение, и я ожидал непредсказуемого результата. Вместо этого это 0.
#include <stdio.h>
#include <limits.h>
int main(void) {
int exp;
int pow = 1;
for (exp = 0; exp < 33; exp++) {
printf("2 to the power of %d is %d\n", exp, pow);
pow *= 2;
}
printf("%d\n", INT_MIN);
printf("%d\n", INT_MAX);
return 0;
}
#include <iostream>
#include <limits>
using namespace std;
int main(void) {
int pow = 1;
for (int exp = 0; exp < 33; exp++) {
cout << "2 to the power of " << exp << " is " << pow << endl;
pow *= 2;
}
int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();
cout << imin << endl;
cout << imax << endl;
return 0;
}
2 to the power of 0 is 1
2 to the power of 1 is 2
2 to the power of 2 is 4
2 to the power of 3 is 8
2 to the power of 4 is 16
2 to the power of 5 is 32
2 to the power of 6 is 64
2 to the power of 7 is 128
2 to the power of 8 is 256
2 to the power of 9 is 512
2 to the power of 10 is 1024
2 to the power of 11 is 2048
2 to the power of 12 is 4096
2 to the power of 13 is 8192
2 to the power of 14 is 16384
2 to the power of 15 is 32768
2 to the power of 16 is 65536
2 to the power of 17 is 131072
2 to the power of 18 is 262144
2 to the power of 19 is 524288
2 to the power of 20 is 1048576
2 to the power of 21 is 2097152
2 to the power of 22 is 4194304
2 to the power of 23 is 8388608
2 to the power of 24 is 16777216
2 to the power of 25 is 33554432
2 to the power of 26 is 67108864
2 to the power of 27 is 134217728
2 to the power of 28 is 268435456
2 to the power of 29 is 536870912
2 to the power of 30 is 1073741824
2 to the power of 31 is -2147483648
2 to the power of 32 is 0
-2147483648
2147483647
Это неопределенное поведение. Итак, получение 0
является совершенно действительным неопределенным результатом.
int
,Это 2^31 - 1
не 2^31
, Обратите внимание, что INT_MAX
нечетное число
Большинство систем, с которыми вы когда-либо столкнетесь, не будут использовать Величина подписи представлять подписанные номера. Вместо этого они будут использовать Два дополнения.
Выполнение pow * = 2 похоже на pow<<= 1.
Это прекрасно объясняет поведение, которое вы видите.
Когда ваша начальная 1 смещена влево 31 раз, она лежит в знаковом бите целого числа. Представляет минимальное значение int.
Когда вы сдвигаете его еще раз, он переполняется, и в целом числе остается только 32 нулевых бита, поэтому вы получаете 0.