Вот программа, чей сборник выход заставляет меня плакать:2^32 - 1 не входит в uint32_t?
#include <inttypes.h>
int main()
{
uint32_t limit = (1 << 32) - 1; // 2^32 - 1 right?
}
и здесь выход компиляции:
~/workspace/CCode$ gcc uint32.c
uint32.c: In function ‘main’:
uint32.c:5:29: warning: left shift count >= width of type [-Wshift-count-overflow]
uint32_t limit = (1 << 32) - 1; // 2^32 - 1 right?
Я думал, что (1 << 32) - 1
равно 2^32 - 1 и что целые числа без знака на 32 бита варьируются от 0 до 2^32 - 1, разве это не так? Где я неправ?
Предупреждение говорит все. Вы не можете вычислить значение выражения, которое не может быть выражено. –
Возможно, проблема заключается в том, что (1 << 32) требует 1 бит больше пространства (33 бита) для хранения значения - поэтому компилятор подходит, поскольку вы работаете с 32-битной переменной. –
с 32-битным int, 2^32 - 1 будет соответствовать (без знака) ... проблема есть, 2^32 не будет, и это часть выражения, которое вы вычисляете 2^32-1 с. Однако по другим причинам вы, скорее всего, получите правильный ответ, так как uint32_t будет по модулю 2^32. – Dmitri