byte
でビットシフトを使用していたときに、符号なし右シフト(>>>
)を使用すると奇妙な結果になっていました。期待どおりに動作しint
では、両方の右シフトは(>>>
::>>
と符号なしの署名):Javaでバイトを使ったビットシフトの奇妙な動作
int min1 = Integer.MIN_VALUE>>31; //min1 = -1
int min2 = Integer.MIN_VALUE>>>31; //min2 = 1
をしかし、私はbyte
と同じことを行う際に、奇妙なことは、符号なし右シフトして起こる:
byte b1 = Byte.MIN_VALUE; //b1 = -128
b1 >>= 7; //b1 = -1
byte b2 = Byte.MIN_VALUE; //b2 = -128
b2 >>>= 7; //b2 = -1; NOT 1!
b2 >>>= 8; //b2 = -1; NOT 0!
コンパイラがbyte
を内部でint
に変換している可能性がありますが、その動作を説明するには十分ではないようです。
ビットシフトがJavaでバイトと同じように動作するのはなぜですか? byte
、short
とchar
ため
「0xFF」を使用することは正しい解決策です。 +1。なぜ私はそれを提案していないのか分からない。 –