为什么使用JavaScript表达式255<&书信电报;24是负数吗?

为什么使用JavaScript表达式255<&书信电报;24是负数吗?,javascript,bit-manipulation,Javascript,Bit Manipulation,当我在此处运行此代码时: console.log(255<<24==0xff000000) console.log(255因为JavaScript数字是IEEE-754双精度浮点,而不是32位整数。所以0xff000000是一个大的正数(十进制数4278190080),而不是负数,如果它是有符号的32位整数 当你这样做时,你应该这样看。这对你来说应该很直观: 255<<24 == 0xff000000<<0 // Returns true

当我在此处运行此代码时:

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

console.log(255因为JavaScript数字是IEEE-754双精度浮点,而不是32位整数。所以
0xff000000
是一个大的正数(十进制数4278190080),而不是负数,如果它是有符号的32位整数


当你这样做时,你应该这样看。这对你来说应该很直观:

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

255
0xff000000
不指定32位整数的位,而是以十六进制为基数的实数。例如
0xFF000000000000000
4.932417344027687e+27

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

因此,您可以使用
|0
作为一种
int
声明或
(int)
cast:

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

javascript中的
255按位操作将数字转换为有符号32位整数,如T.J.所述,因此与十六进制文字进行安全比较时,您只有31位。如果您希望保留真正需要的无符号数字(而不是将十六进制文字转换为相同的负数),请执行以下操作:

255 * (1 << 24) == 0xff000000

255*(1)请注意,这些转换被认为是解释语义的抽象操作,而不是实际意义上的转换happens@Esailija:一个实现可以采取快捷方式,只要结果与描述相符。在这种情况下,我看不到比实际执行规范描述的操作更好的快捷方式。您只需执行即可对已经存在的整数的按位运算-根本没有转换。@Esailija:如果引擎以整数而不是浮点数启动,同样,这是一种优化,并且允许这样做,前提是结果好像是以浮点数启动的。
255 << 24 == (0xff000000 | 0)
true
255 * (1 << 24) == 0xff000000