2

所以我在控制台中玩转,结果让我难过。

输入:

a = -1
a >>> 100

输出:

268435455

我查看了有关它的 Mozilla 参考页面,但它没有提及 >>> 的行为,当您大量移动时。我假设用零填充将所有位向右移动会导致零。

这是Firefox中的错误还是什么?

4

2 回答 2

3

看来您最多只能移动 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

于 2013-11-07T00:08:24.393 回答
1

JavaScript中 a 上的任何位运算符Number都会将其操作数转换为 32 位大端有符号数。

这意味着如果数字大于 32 位可以存储的数字,它将被截断。大端是指从左到右读取数字时按自然顺序存储数字,即先存储更重要的数字,因此如果数字存储超过一个字节,则其第一个字节更重要。

这意味着-1' 的二进制表示将是......

11111111 11111111 11111111 11111111

(这是-1二进制补码。这是通过以二进制计算数字的值,然后翻转每一位并加一来执行的。)

当你移过去时100,你会发现它只是移4过去,留给你...

00001111 11111111 11111111 11111111

如您所见,不再设置高位,因此它不是负数,实际上是268435455(您问题中的数字)。

于 2013-11-07T00:09:43.353 回答