为什么-3 >> 1等于-2?

时间:2018-11-06 18:27:15

标签: javascript

在JS中,我们遇到以下情况:

<<运算符:

3 << 1  // 6
5 << 1  // 10
7 << 1  // 14
-3 << 1 // -6
-5 << 1 // -10
-7 << 1 // -14

>>运算符:

3 >> 1  // 1
5 >> 1  // 2
7 >> 1  // 3
-3 >> 1 // -2
-5 >> 1 // -3
-7 >> 1 // -4

如您所见,对于<<运算符,对于小于2 ** 32的值,我们有abs(X << Y) === abs(-X << Y)

对于>>运算符,为什么这不成立?

2 个答案:

答案 0 :(得分:5)

因为您要旋转这些数字的二进制表示形式。负数存储为 2's complement binary

因此(出于说明目的,仅使用8位):

-3 = 11111101

如果您旋转>>,这是符号传播,您将得到:

11111110 = -2

因为符号传播移位会将符号位复制到最左侧的位。

使用正数更容易:

3 = 00000011

使用>>进行移位后(由于它为正,因此您将移位为零)

00000001 = 1

答案 1 :(得分:0)

这是因为减号比移位运算符少greater precedence

因此,-3 >> 1将以(-3) >> (1)的身份运行,而不是以-(3 >> 1)的身份运行。