バイト値と明らかに下位8ビットがあるとわかっている値を加算しています。
ビット演算を実行する前にバイト配列からロードされた値は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));