我理解什么是零填充右移和结果,当第二个操作数非零时,它产生完美意义:
-7 >>> 1
2147483644
与
比较-7 >> 1
-4
但是当第二个操作数为零时:
-7 >> 0
-7 // Looks right!
-7 >>> 0
4294967289 // What? Why?
如果我正在移位零位,这是不是意味着我根本没有移位?如果是这样的话,它不应该给我原来的号码吗?我希望-7 >>> 0 === -7
还
-7 >>> 32
4294967289
同样,根据定义,我希望-7 >>> n === 0 where n >= 32
因为所有数字都变为零!
答案 0 :(得分:3)
在specs中找到了它的内部工作原理。
x >>> 0
将执行ToUint32(x)
和
7.1.6 ToUint32(参数)
抽象操作ToUint32将参数转换为232之一 0到232-1范围内的整数值,包括0和232-1。这个摘要 操作函数如下:设数为ToNumber(参数)。 ReturnIfAbrupt(数字)。如果number为NaN,+ 0,-0,+∞或-∞,则返回 + 0。令int为与数字相同的数学值,其大小为floor(abs(number))。让int32bit为int modulo 232.返回int32bit。
注意让int32bit为int modulo 和
符号“x modulo y”(y必须是有限且非零)计算a 与y(或零)相同符号的值k使得abs(k)< abs(y)和 对于某个整数q,x-k = q×y。
所以按照惯例,-7 mod 2^32 === 2^32 - 7 === 4294967289