ビットシフトと論理積を使ってbyte配列をintへ格納しているのですが、

byte [] data = {-128, -64, 0, 32};
int v = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];

のようにしてもうまく格納できません。
vの二進数表記の出力などを見て比較しましたが原因は、
負数のbyteがシフト計算の途中でintにキャストされているせいかもしれません。
もしもこの格納を上手く効率的にできる方法がありましたらご教授願います←一つ目


そして現在は同じ長さのint配列を用意し、それにbyte配列の値をループで格納し直すことをしています。

int [] idata = new int[data.length];
for(int i=0; i<data.length; i++)
idata[i] = data[i] < 0 ? data[i] + 256 : data[i];
int v = (idata[0] << 24) | (idata[1] << 16) | (idata[2] << 8) | idata[3];

これで今のところ正しく格納できていますが、
byte配列を効率的にint配列へ格納する方法などはありませんでしょうか(System.arraycopy的なもの)←二つ目

よろしくお願いします