バイト値と明らかに下位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));