我很难理解移位的工作原理。我希望a
和b
是一样的,但事实并非如此:
a = 0xff000000;
console.log(a.toString(16));
b = 0xff << 24;
console.log(b.toString(16));
导致:
ff000000
-1000000
我在尝试从 32 个字节创建一个 4 位数字时想到了这段代码。
按位运算符将其操作数转换为有符号的 32 位数字。这意味着最高有效位是符号位,它只为您提供 31 位的数字值。
0xff000000
本身被解释为 64 位浮点值。但是将其截断为 32 位有符号整数会产生负值,因为最高有效位是 1
:
0xff000000.toString(2);
> "11111111000000000000000000000000"
(0xff000000 | 0).toString(16)
> -1000000
根据对 32 位无符号整数的按位运算? 您可以使用>>> 0
将值转换回无符号值:
0xff << 24 >>> 0
> 4278190080
从规格:
结果是一个无符号的 32 位整数。
所以事实证明这是根据规范的。 位移运算符返回有符号的 32 位整数结果。
结果是一个有符号的 32 位整数。
来自最新的 ECMAScript 规范。
因为您的数字已经有 8 位长,所以将其向左移动 24 位,然后将其解释为有符号整数意味着前导1
位被视为使其成为负数。