我无法理解节点(v10.15.0)中移位的工作方式。我希望a
和b
相同,但事实并非如此:
a = 0xff000000;
console.log(a.toString(16));
b = 0xff << 24;
console.log(b.toString(16));
导致:
ff000000
-1000000
我在尝试从4个字节创建32位数字时遇到了这段代码。
答案 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位整数。
因为您的数字已经是8位长,将其左移24位,然后将其解释为有符号整数,则意味着前1
位被看作是负数。