我知道JavaScript中的数字以IEEE-754格式存储。但是,当我们使用整数,特别是按位运算符时,它们表示为32位的二进制补码。
因此-1
将为0xFFFFFFFF
。但是(-1).toString(2)
是-1
。并且-1 >>> 31
是1,是的,但是-1 >>> 32
必须是0
,但是它是4294967295
。并且-1 << 32
必须为0
,但必须为-1
。
为什么按位运算以这种方式工作?并且toString()
用符号-
显示数字,为什么这个减号不在符号位?另外,为什么-1 >> 0
是-1
,但-1 >>> 0
是4294967295
?我知道>>
和>>>
之间有什么区别,但是第二个操作数是0
,所以我不明白为什么这些操作以不同的方式工作。
[在算术移位中,符号位被扩展以保留数字的签名。
8位中的-1是11111111 -2是11111110 ...
但是,逻辑右移并不关心该值是否可以可能代表一个签名的数字;它只是将所有内容移至右边,并从左边开始用0填充。
所以这里,-1 >>>将11111111向右推一个,因此“-”号丢失,并显示最高的正数0111111(以8位显示)