ロードしたバイト値 (たとえば、バイト配列からロードされた値や戻り値がバイト型のメソッドから返された値) とビット論理和を実行しています。 ビット演算を実行する前にバイト値は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));
}