Это скорее дизайн языка, нежели вопрос программирования.
Ниже приводится выдержка из JLS 15.19 Операторы сдвига :
Если повышенный тип левого операнда равен int
, только пять младших битов правого операнда используются в качестве расстояния сдвига.
Если повышенный тип левого операнда равен long
, то только шесть младших битов правого операнда используются в качестве расстояния сдвига.
Это поведение также указано в C # , и хотя я не уверен, что оно входит в официальную спецификацию для Javascript (если есть), оно также верно, по крайней мере, на основе моего собственного теста.
Следствием этого является следующее:
(1 << 32) == 1
Я понимаю, что эта спецификация, вероятно, "вдохновлена" тем фактом, что базовое оборудование берет только 5 битов для операнда подсчета при сдвиге 32-битных значений (и 6 битов для 64-битных), и я могу понять такое поведение указанный на уровне JVM, например, но почему языки высокого уровня, такие как C # и Java, сохраняют это довольно низкое поведение? Разве они не должны обеспечивать более абстрактное представление помимо аппаратной реализации и вести себя более интуитивно? (Еще лучше, если они могут принять отрицательный счет, чтобы означать сдвиг в ДРУГОМ направлении!)