Совершенно нормально использовать операцию сдвига внутри oop. Проблема с вашим кодом состоит в том, что var
никогда не будет равным или большим как INT_MAX
.
. Для лучшего понимания позвольте мне объяснить проблему с 8-битным знаковым целым числом, а не с 32-битным целым числом со знаком.
Вы начинаете со значения var = 00000001b
(b
указывает, что это двоичное число), а INT_MAX
для 8-разрядного целого числа со знаком будет INT_MAX = 01111111b = 127
(обратите внимание, что старший бит равен 0, это потому, что это бит знака)
Теперь, если вы ушли влево var
, вы медленно сдвигаете этот сингл 1 вправо
var << 1 = 00000010b = 2
var << 2 = 00000100b = 4
var << 3 = 00001000b = 8
var << 4 = 00010000b = 16
var << 5 = 00100000b = 32
var << 6 = 01000000b = 64
var << 7 = 10000000b = -128
var << 8 = 00000000b = 0
var << 9 = 00000000b = 0
...
После седьмого сдвига 1 бит достиг максимального бита, но так как у нас есть 8-битовое целое число со знаком, мы интерпретируем 10000000b
не как 128
, а как -128
, и поэтому var < INT_MAX
всегда будет истинным.
Если вы не Чтобы не знать, почему это происходит, вы можете прочитать два дополнения числа.
Редактировать: Более формально, как указал Эндрю Хенле: смещение значения за пределы диапазона его тип не определен. Результат операции x << y
должен быть равен x * 2^y
, а если x * 2 ^y
не представлен типом, результат не определен.
Таким образом, приведенная выше таблица больше похожа на
var << 1 = 00000010b = 2
var << 2 = 00000100b = 4
var << 3 = 00001000b = 8
var << 4 = 00010000b = 16
var << 5 = 00100000b = 32
var << 6 = 01000000b = 64
var << 7 = undef. = undef.
var << 8 = undef. = undef.
var << 9 = undef. = undef.
...