我在 Javascript 中注意到的一件事 -
一个<< -1
Returns 0 when a = even.
Returns -2147483648 when a = odd.
同样,当-1
更改为其他一些-ve
数字时,返回不同的值。
有人可以解释引擎盖下发生了什么位操作吗?还是行为未定义?
谢谢
编辑
也不应该用零填充右移,即 -2 >>> 1
返回 7
吗?
-2 = 1110. After, right shift with zero-fill, it should give 0111 = 7
但是
a = -2; console.log(a >>> 1);
返回
2147483647
最佳答案
我也很想知道我是怎么来到这里的。我做了一些研究并弄清楚了行为。本质上,JavaScript 将操作数和移位值视为位序列而不是数字。它适用于 32 位整数( float 被 chop )并且最大移位为 32 位。如果我们移动一个大于 32 的数字,所有的位都会移出,结果为零。为确保移位小于或等于 32,JavaScript chop 了 5 个最低有效位 [ a << (b&0x1F)
] 或者可能使用模数方法 [ a << (b%32)
] 产生相同的结果。
顺便说一句,将要移动的负数视为一个位序列,而不是负数(即 -1)。在这种情况下 b = -1 = 0xFFFFFFFF
.由于此数字大于 32,因此被 chop 0xFFFFFFFF & 0x1F = 31
或 0xFFFFFFFF % 32 = 31
.
因此,在您的示例中,“a”从最低有效位一直移位到最高有效位(符号位)。因此,移位的结果是 0x00000000
或( 0x80000000 = -2147483648
),具体取决于操作数是否设置了 1 位(奇数或偶数)。
关于javascript - 在 Javascript 中以负移位计数左移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559921/