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