当我在这里运行此代码时:
console.log(255<<24==0xff000000)
我得到一个假而不是真。那是为什么?
答案 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位整数的位,而是指定十六进制数的实数。例如0xff000000000000000000000
是4.932417344027687e+27
除>>>
之外的所有按位运算都给出了操作数int32语义,>>>
给出了uint32语义。
因此,您可以使用| 0
作为int
声明或(int)
演员:
255 << 24 == (0xff000000 | 0)
true