这更多的是语言设计而不是编程问题.
以下是JLS 15.19移位运算符的摘录:
如果左手操作数的提升类型是
int,则只使用右手操作数的五个最低位作为移位距离.如果左侧操作数的提升类型是
long,则只使用右侧操作数的六个最低位作为移位距离.
这种行为也在C#中指定,虽然我不确定它是否在Javascript的官方规范中(如果有的话),但至少基于我自己的测试也是如此.
结果是以下情况属实:
(1 << 32) == 1
Run Code Online (Sandbox Code Playgroud)
据我所知,这个规范很可能受到以下事实的启发:当移位32位值(64位为6位)时,底层硬件只占用计数操作数的5位,我可以理解在例如,JVM级别,但为什么高级语言(如C#和Java)会保留这种相当低级别的行为?它们不应该提供超出硬件实现的更抽象的视图,并且行为更直观吗?(如果他们可以采取负数来表示向其他方向转移,那就更好了!)