Adl*_*ler 4 javascript bit-manipulation
当我在这里运行这段代码时:
console.log(255<<24==0xff000000)
Run Code Online (Sandbox Code Playgroud)
我得到的是假的而不是真的。这是为什么?
因为 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 位有符号整数的范围。我不太确定为什么我觉得这是相关的,但我确实如此,所以我想我会把它留在答案中...)