Я что-то упустил?Я запустил следующее:
$ uname -a
Linux archlinux 4.16.6-1-ARCH #1 SMP PREEMPT Mon Apr 30 12:30:03 UTC 2018 x86_64 GNU/Linux
Затем в программе на C:
long l;
printf("sizeof long: %d\n", sizeof l);
, который выдает:
sizeof long: 8
Не означает ли это, что каждый длинныйсодержит 64 бита?Но когда я выполняю следующую строку кода:
printf("2^64: %ld\n", 1UL<<64);
я получаю следующее предупреждение от gcc:
sizeof.c: 14: 29: предупреждение: счетчик сдвига влево>= ширина типа [-Wshift-count-overflow]
Если вместо этого уменьшить левое смещение до 63, предупреждение исчезает, но выводится:
2 ^ 64: -9223372036854775808
Это наводит меня на мысль, что мое предположение о беззнаковом длинном из 64 используемых битов неверно, но почему?