ロードしたバイト値 (たとえば、バイト配列からロードされた値や戻り値がバイト型のメソッドから返された値) とビット論理和を実行しています。
ビット演算を実行する前にバイト値は32ビットまで符号拡張されます。
したがって、b[0]
の値が 0xff
で、x
の初期値が 0
だとすると、
((x << 8) | b[0])
は、0xff
が符号拡張で 0xffffffff
になるので、結果として 0xffffffff
が得られます。
特に、バイト配列 int にパックする以下のようなコードはひどく間違っています。
int result = 0; for(int i = 0; i < 4; i++) { result = ((result << 8) | b[i]); }
その代わりに、以下のようなイディオムは動作します。
int result = 0; for(int i = 0; i < 4; i++) { result = ((result << 8) | (b[i] & 0xff)); }