На всех современных платформах типа ПК int
имеет только 32 бита.Сдвиг больше, чем это не определено.И помните, что битовые числа для сдвига начинаются с нуля, поэтому для 32-битного типа (например, int
) допустимый диапазон битов составляет от 0
до 31
(включительно).
Теперь дляразница между 3 << 32
и 3 << sz
: в первом случае компилятор может знать, что он смещается более чем на 32 бита, поэтому он может заключить, что это будет 64-разрядная операция (с использованием long long
).Во втором случае компилятор не знает значение sz
, потому что это простая переменная, а не константа времени компиляции.Следовательно, он должен предполагать, что это простой int
сдвиг и что значение sz
находится в диапазоне.