这更像是一个语言设计而不是一个编程问题。
以下是JLS 15.19 Shift Operators的摘录:
如果左侧操作数的提升类型是
int
,则仅将右侧操作数的五个最低位用作移位距离。如果左侧操作数的提升类型是
long
,则仅将右侧操作数的最低六位用作移位距离。
这种行为也在C# 中指定,虽然我不确定它是否在 Javascript 的官方规范中(如果有的话),但至少根据我自己的测试也是如此。
结果是以下情况为真:
(1 << 32) == 1
我知道这个规范可能是受到以下事实的“启发”:底层硬件在移动 32 位值(64 位时需要 6 位)时,计数操作数只需要 5 位,我可以理解在例如 JVM 级别,但为什么 C# 和 Java 等高级语言会保留这种相当低级的行为呢?他们不应该提供超越硬件实现的更抽象的视图并更直观地表现吗?(如果他们可以采用负数来表示转向另一个方向,那就更好了!)