左移在 Javascript 中导致负数

  • 本文关键字:Javascript 左移 javascript
  • 更新时间 :
  • 英文 :


我很难理解移位的工作原理。我希望ab是一样的,但事实并非如此:

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位被视为使其成为负数。

最新更新