簽名與無簽名班次

在 Java 中,所有數字原語都是簽名的。例如,int 總是表示來自[-2 ^ 31 - 1,2 ^ 31]的值,保持第一位對值進行符號 - 1 表示負值,0 表示正數。

基本移位運算子 >><< 是簽名運算子。他們將保留價值的標誌。

但程式設計師通常使用數字來儲存無符號值。對於 int,它意味著將範圍轉換為[0,2 ^ 32 - 1],其值是 signed signed 的兩倍。

對於那些高階使用者來說,簽名的位沒有任何意義。這就是為什麼 Java 新增了 >>>,一個左移運算子,無視該符號位。

                initial value:               4 (                                100)
     signed left-shift: 4 << 1               8 (                               1000)
    signed right-shift: 4 >> 1               2 (                                 10)
 unsigned right-shift: 4 >>> 1               2 (                                 10)
                initial value:              -4 (   11111111111111111111111111111100)
    signed left-shift: -4 << 1              -8 (   11111111111111111111111111111000)
   signed right-shift: -4 >> 1              -2 (   11111111111111111111111111111110)
unsigned right-shift: -4 >>> 1      2147483646 (    1111111111111111111111111111110)

為什麼沒有 <<<

這來自右移的預期定義。因為它填滿了左邊的空曠地方,所以沒有決定採取一點點的標誌。因此,不需要 2 個不同的運算子。

請參閱此問題以獲得更詳細的答案。