byte 型や short 型の変数に対して論理右シフト代入演算子 >>>= を使用する場合は注意が必要である。
Java は数値演算を最低でも 32 bit 整数精度で行う。
そのため byte 型や short 型の変数も数値演算の途中では 32 bit 整数精度で表現されることになる。
下記の例1.で言えば、論理右シフトされる byte 型変数 b の値 -1 は、数値演算の途中では 8 bit 精度の 11111111b としてではなく 32 bit 精度の 11111111111111111111111111111111b として扱われる。
当然、この値を右に 7 シフトした場合の結果は 00000001111111111111111111111111b であり 00000001b ではない。
故に、最終的に byte 型変数 b に代入される演算結果は 32 bit の 00000001111111111111111111111111b を 8 bit に丸めた 11111111b、すなわち値 -1 である。
この現象は論理右シフト演算子 >>> を使用した場合にも起こる。
例1.
public class tip00000_1
{
public static void main( String args[] )
{
byte b = -1; // 11111111b
b >>>= 7;
System.out.println( b );
}
}
実行結果
-1
関連
・右シフト演算子(>>)使用上の注意 - C/C++
|