2017-07-26 106 views
1

我明白了什麼是填零右移並導致它產生非常清楚了,當第二個操作數爲非零:>>>(填零右移)當第二OPRAND爲零

-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

https://stackoverflow.com/questions/1822350/what-is-the-javascript-operator-and-how-do-you-use-it – DAle

+0

@ DAle有幫助。規範給出了確切的機制。見下文 – Boyang

回答

2

specs中找到它的內部工作原理。

x >>> 0將做ToUint32(x)

而且

7.1.6 ToUint32(參數)

的抽象操作ToUint32範圍爲0至232-轉換參數232個 整數值之一1,包括在內。這個摘要 的操作功能如下:讓number爲ToNumber(參數)。 ReturnIfAbrupt(數字)。如果數字是NaN,+ 0,-0,+∞或-∞,則返回 +0。設int是與數字相同符號的數學值,其數值爲floor(abs(數字))。設int32bit爲int模 232.返回int32bit。

設int32bit是int模,和

符號「X模Y」(y必須是有限的,並且非零)計算相同符號的一個 值k爲y(或零),使得對於某個整數q,abs(k)< abs(y)和 x-k = q×y。

因此,通過上述慣例,-7 mod 2^32 === 2^32 - 7 === 4294967289

相關問題