这是错误的:
(0xffffffff << 31 << 1) === (0xffffffff << 32)
看起来应该是真的。添加>>> 0
任何地方都不会改变这一点。
这是为什么以及如何正确编写处理的代码<< 32
?
轮班操作员总是有效地有一个范围为 0-31 的右操作数。
From Mozilla 文档:
移位运算符将其操作数按大端顺序转换为 32 位整数,并返回与左操作数类型相同的结果。正确的操作数应该小于 32,但是如果不仅使用低五位.
或者从ECMAscript 5 标准:
产生式 ShiftExpression : ShiftExpression
- Let lref是评估的结果移位表达式.
- Let lval为 GetValue(lref).
- Let rref是评估的结果加法表达式.
- Let rval为 GetValue(rref).
- Let lnum为 ToInt32(lval).
- Let rnum为 ToUint32(rval).
- 令 *shiftCount 为屏蔽除 > 的最低有效 5 位之外的所有结果rnum,即计算rnum&0x1F。
- 返回左移结果lnum by 移位计数位。结果是一个带符号的 32 位整数。
(对于其他轮班操作员也是如此。)
我并不完全清楚为什么会出现这种情况,但 Java 和 C# 对于 32 位整数类型的工作方式是相同的。 (对于 64 位整数类型,操作数的范围为 0-63。)请参阅JLS 15.19例如。
My guess是这在常见的处理器平台上是有效的,但我没有证据表明......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)