1

いつ:

byte[] b = {-128, 0, 0, 0};
long total = 0;

最初の式は -2,147,483,648 を返します。

for (int i = 0; i < b.length; i++) {
   int shift = (b.length - 1 - i) * 8;
   total += (b[i] & 255) << shift;
}

2 番目は 2,147,483,648 を返します。

for (int i = 0; i < b.length; i++) {
   int shift = (b.length - 1 - i) * 8;
   long tmp = (b[i] & 255);
   total += tmp << shift;
}

私の質問は; 同じステートメントのように見えるのに、最初のステートメントが肯定的で、2 番目のステートメントが否定的であるのはなぜですか?

4

3 に答える 3

3

この行で

total += (b[i] & 255) << shift;

括弧で囲まれた式は型intであり、左シフトはその左端のビットを 1 に設定し、負の数にします。への変換longは、すべての計算が完了した後でのみ行われます。

long tmp = (b[i] & 255);

ここに式がlongあり、左端のビットはシフト後もゼロのままです。

最初の式を保持したい場合はlong、括弧で囲まれた式にキャストを追加するか、long定数を使用し255Lます。

于 2012-08-28T20:43:24.377 に答える
1

intを符号ビットにシフトすると、負の数になります。同じ量だけlongをシフトすると、正の数になります。

于 2012-08-28T20:44:08.853 に答える
1

次のコードを実行すると、何が起こっているのか理解できます。

System.out.println(Integer.toBinaryString(-2147483648));
System.out.println(Long.toBinaryString(2147483648L));

印刷します

10000000000000000000000000000000
10000000000000000000000000000000

同じビットは、との解釈が異なりlongますint

于 2012-08-28T20:45:42.930 に答える