这更多是关于语言设计而非编程问题。
以下是来自JLS 15.19移位运算符的摘录:
如果左操作数的提升类型为
int
,则仅使用右操作数的五个最低位作为移位距离。如果左操作数的提升类型为
long
,则仅使用右操作数的六个最低位作为移位距离。
这种行为在C#中也有规定,虽然我不确定它是否在Javascript的官方规范中(如果有的话),但至少根据我的测试结果,它也是正确的。
其结果是以下内容为真:
(1 << 32) == 1
我理解这个规范可能受到底层硬件只为32位值(64位为6位)的计数操作数取5位的启发,我可以理解这种行为在JVM级别上进行了规定,但是为什么高级语言如C#和Java会保留这种相对低级别的行为呢?它们不应该提供一个更抽象的视图超越硬件实现并表现得更加直观吗?(如果它们能将负数计数视为向其他方向移位,那就更好了!)
int
类型和移位计数掩码就是这些特征之一。其他语言,如Scheme,在这方面是“更高级别”的。 - Thomas Pornin