所以我在控制台中玩转,结果让我难过。
输入:
a = -1
a >>> 100
输出:
268435455
我查看了有关它的 Mozilla 参考页面,但它没有提及 >>> 的行为,当您大量移动时。我假设用零填充将所有位向右移动会导致零。
这是Firefox中的错误还是什么?
所以我在控制台中玩转,结果让我难过。
输入:
a = -1
a >>> 100
输出:
268435455
我查看了有关它的 Mozilla 参考页面,但它没有提及 >>> 的行为,当您大量移动时。我假设用零填充将所有位向右移动会导致零。
这是Firefox中的错误还是什么?
看来您最多只能移动 31 个。
从您在帖子中链接的网站 ( MDN ):
将二进制表示中的 a 向右移动 b (< 32) 位,丢弃移出的位,并从左侧移入零。
根据实际规格(第 77 页)
令 shiftCount 为屏蔽掉除 rnum 的最低有效 5 位以外的所有结果,即计算 rnum & 0x1F。
实际发生的情况是,当您移动 100 时,它会移动(100 & 0x1F)
4 或 4。
-1 >>> 100 === -1 >>> 4
如果您要将它分成多个班次,那么它将起作用:
-1 >>> 25 >>> 25 >>> 25 >>> 25 === 0
JavaScript中 a 上的任何位运算符Number
都会将其操作数转换为 32 位大端有符号数。
这意味着如果数字大于 32 位可以存储的数字,它将被截断。大端是指从左到右读取数字时按自然顺序存储数字,即先存储更重要的数字,因此如果数字存储超过一个字节,则其第一个字节更重要。
这意味着-1
' 的二进制表示将是......
11111111 11111111 11111111 11111111
(这是-1
二进制补码。这是通过以二进制计算数字的值,然后翻转每一位并加一来执行的。)
当你移过去时100
,你会发现它只是移4
过去,留给你...
00001111 11111111 11111111 11111111
如您所见,不再设置高位,因此它不是负数,实际上是268435455
(您问题中的数字)。