2013-07-26 129 views
0

爲什麼Java中的表達式(-1 >>> 32)按預期評估爲-1而不是0?該>>> -Shift運營商應填寫前述0,所以結果應該具有的所有位設置爲0。(-1 >>> 32)== -1?

這是奇怪的,因爲它打破了>>>語義:例如(-1 >>> x)的前x位對所有0 <= x <= 31設置爲0。唯一的(意外的)例外是32.

這是故意的行爲,錯誤還是(過度動機的)編譯器優化?

我使用表達式~(-1 >>> x)來擴展一個cidr-netmask到它的32位等價物,但是看起來,必須單獨處理/ 32-掩碼。

回答

1

檢查this post

從回答筆者Rasmus Faber

報價從Java語言規範:

如果左側操作數升級後的類型爲int,只有在五 最低階位右側操作數被用作移動距離 。就好像右邊的操作數受掩碼值爲0x1f的 按位邏輯AND運算符&(第15.22.1節)。 實際使用的換檔距離總是在0到 31之間(含)。

龍簡稱:由於操作數範圍限制,-1 >>> 32相當於-1 >>> 0這是-1

+0

thx爲您的答覆和抱歉發佈重複的問題。這解釋得很好。 – paranoid

相關問題