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

时间:2013-08-03 16:32:09

标签: javascript bit-manipulation

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

console.log(255<<24==0xff000000)

我得到一个假而不是真。那是为什么?

3 个答案:

答案 0 :(得分:4)

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

执行<<时,为了进行位移,移位的数字(在您的情况下为255)暂时为converted to a signed 32-bit integer

00000000000000000000000011111111
^\                             /
| \----- significant bits ----/
+------- sign bit

当我们向左移动24个位置时,1位最终位于符号位:

11111111000000000000000000000000
^\                             /
| \----- significant bits ----/
+------- sign bit

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

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

答案 1 :(得分:2)

以这种方式看待它。这看起来应该很直观:

255<<24 == 0xff000000<<0          // Returns true

按位运算符处理整数而不是数字类型。将它视为与其他语言类似的类型转换,在这种情况下,您恰好将较大的数字放入较小的数字中。你输了东西......

由于采用了浮点格式,Javascript牺牲了精度以允许更大的数字。

因此,Javascript将失去0xff000000的精度,与255的精度相同。

答案 2 :(得分:0)

0xff000000不指定32位整数的位,而是指定十六进制数的实数。例如0xff0000000000000000000004.932417344027687e+27

>>>之外的所有按位运算都给出了操作数int32语义,>>>给出了uint32语义。

因此,您可以使用| 0作为int声明或(int)演员:

255 << 24 == (0xff000000 | 0)
true