左移会导致节点javascript中出现负数

时间:2019-01-03 22:23:22

标签: javascript node.js

我无法理解节点(v10.15.0)中移位的工作方式。我希望ab相同,但事实并非如此:

a = 0xff000000;
console.log(a.toString(16));
b = 0xff << 24;
console.log(b.toString(16));

导致:

ff000000
-1000000

我在尝试从4个字节创建32位数字时遇到了这段代码。

2 个答案:

答案 0 :(得分:5)

按位运算符将其操作数转换为带符号的32位数字。这意味着最高有效位是符号位,数字值只给您31位。

0xff000000本身被解释为64位浮点值。但是将其截断为32位带符号整数会产生负值,因为最高有效位是1

0xff000000.toString(2);
> "11111111000000000000000000000000"

(0xff000000 | 0).toString(16)
> -1000000

根据Bitwise operations on 32-bit unsigned ints?,您可以使用>>> 0将值转换回无符号值:

0xff << 24 >>> 0
> 4278190080

来自spec

  

结果是一个无符号的32位整数。

答案 1 :(得分:2)

因此,事实证明这是符合规范的。移位运算符返回带符号的32位整数结果。

  

结果是一个有符号的32位整数。

来自the latest ECMAScript spec

因为您的数字已经是8位长,将其左移24位,然后将其解释为有符号整数,则意味着前1位被看作是负数。