为什么 << 32 在 JavaScript 中不会产生 0?

2023-11-29

这是错误的:

(0xffffffff << 31 << 1) === (0xffffffff << 32)

看起来应该是真的。添加>>> 0任何地方都不会改变这一点。

这是为什么以及如何正确编写处理的代码<< 32?


轮班操作员总是有效地有一个范围为 0-31 的右操作数。

From Mozilla 文档:

移位运算符将其操作数按大端顺序转换为 32 位整数,并返回与左操作数类型相同的结果。正确的操作数应该小于 32,但是如果不仅使用低五位.

或者从ECMAscript 5 标准:

产生式 ShiftExpression : ShiftExpression

  1. Let lref是评估的结果移位表达式.
  2. Let lval为 GetValue(lref).
  3. Let rref是评估的结果加法表达式.
  4. Let rval为 GetValue(rref).
  5. Let lnum为 ToInt32(lval).
  6. Let rnum为 ToUint32(rval).
  7. 令 *shiftCount 为屏蔽除 > 的最低有效 5 位之外的所有结果rnum,即计算rnum&0x1F。
  8. 返回左移结果lnum by 移位计数位。结果是一个带符号的 32 位整数。

(对于其他轮班操作员也是如此。)

我并不完全清楚为什么会出现这种情况,但 Java 和 C# 对于 32 位整数类型的工作方式是相同的。 (对于 64 位整数类型,操作数的范围为 0-63。)请参阅JLS 15.19例如。

My guess是这在常见的处理器平台上是有效的,但我没有证据表明......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 << 32 在 JavaScript 中不会产生 0? 的相关文章

随机推荐