为什么 JavaScript 表达式 255 << 24 是负数?

Adl*_*ler 4 javascript bit-manipulation

当我在这里运行这段代码时:

console.log(255<<24==0xff000000)
Run Code Online (Sandbox Code Playgroud)

我得到的是假的而不是真的。这是为什么?

T.J*_*der 5

因为 JavaScript 数字是 IEEE-754 双精度浮点数,而不是 32 位整数。一个大的正数(十进制 4,278,190,080)也是如此0xff000000,而不是负数(如果它是有符号的 32 位整数)。

当您这样做时<<,被移位的数字(在您的例子中为 255)会暂时转换为有符号的 32 位整数,以便进行移位:

00000000000000000000000011111111
^\ /
| \----- 有效位 ----/
+-------- 符号位

当我们左移 24 位时,符号位中会出现 1 位:

11111111000000000000000000000000
^\ /
| \----- 有效位 ----/
+-------- 符号位

...因此结果最终为负数,并变回负 IEEE-754 数(十进制 -16,777,216)。-16,777,216 不等于 4,278,190,080。

(IEEE-754 双精度浮点数的范围大于 32 位有符号整数的范围。我不太确定为什么我觉得这是相关的,但我确实如此,所以我想我会把它留在答案中...)