>>> (当第二个oprand为零时,零填充右移)

时间:2017-07-26 07:30:49

标签: javascript bit-manipulation bitwise-operators bit-shift

我理解什么是零填充右移和结果,当第二个操作数非零时,它产生完美意义:

-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因为所有数字都变为零!

1 个答案:

答案 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