为什么使用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
2550xff000000
不指定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