1

重複の可能性:
Java は整数のアンダーフローとオーバーフローをどのように処理し、どのようにチェックしますか?
System.out.println(4*2147483647) はどのように Java で -4 に等しいのですか?

これが成り立つ理由を知りたい:

2 * Integer.MAX_VALUE == -2

お返事をお待ちしております。

4

5 に答える 5

6

この結果は、整数オーバーフローが原因で得られます。負の整数を表す2 の補数系では、最大値011.....112を掛けて、 に対応する22が得られます。11.....110-2

于 2012-10-23T17:42:46.470 に答える
1

これは、整数オーバーフローが原因です。

于 2012-10-23T17:44:50.467 に答える
1

Integer.MAX_VALUEです0x7FFFFFFF。2 を掛けると得られます0xFFFFFFFE(1 ビット左にシフトするのと同じ)。これは負の数 (最初のビットが 1) で、 のバイナリ表現です-2

于 2012-10-23T17:45:05.563 に答える
1

これは、数値が正 (0) か負 (1) かを示すために左端のビットが使用される 2 の補数によるものです。したがって、max int を単独で追加すると (multiplfy を 2 倍するのと同じ)、次のようになります。

  011111111111111111111111
+ 011111111111111111111111
__________________________
  111111111111111111111110

111111111111111111111110-2を表します。

于 2012-10-23T17:45:11.433 に答える
0

Int の MAX_VALUE は 2^31 - 1 = 2147483647 = 0111 1111 1111 1111 1111 1111 1111 1111 (2 進数) 最上位ビット (ここでは最初のビット 0 で、整数が正の数であることを示し、1 は負を示します。

(整数の長さが 4 バイトであるとします)、2 * MAX_VALUE、コンピューターでは、整数の 2 倍はビット上で左シフト (演算子 << ) になります。2 << 1 = 4; 2 << 2 = 8; したがって、0111 1111 1111 1111 1111 1111 1111 1111 << 1 は 1111 1111 1111 1111 1111 1111 1111 1110 になり、10 進数では -2 に等しくなります。

于 2012-10-23T18:11:21.777 に答える