簽名與無簽名班次
在 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 個不同的運算子。
請參閱此問題以獲得更詳細的答案。