重複の可能性:
Java は整数のアンダーフローとオーバーフローをどのように処理し、どのようにチェックしますか?
System.out.println(4*2147483647) はどのように Java で -4 に等しいのですか?
これが成り立つ理由を知りたい:
2 * Integer.MAX_VALUE == -2
お返事をお待ちしております。
重複の可能性:
Java は整数のアンダーフローとオーバーフローをどのように処理し、どのようにチェックしますか?
System.out.println(4*2147483647) はどのように Java で -4 に等しいのですか?
これが成り立つ理由を知りたい:
2 * Integer.MAX_VALUE == -2
お返事をお待ちしております。
この結果は、整数オーバーフローが原因で得られます。負の整数を表す2 の補数系では、最大値011.....11
2を掛けて、 に対応する22
が得られます。11.....110
-2
これは、整数オーバーフローが原因です。
Integer.MAX_VALUE
です0x7FFFFFFF
。2 を掛けると得られます0xFFFFFFFE
(1 ビット左にシフトするのと同じ)。これは負の数 (最初のビットが 1) で、 のバイナリ表現です-2
。
これは、数値が正 (0) か負 (1) かを示すために左端のビットが使用される 2 の補数によるものです。したがって、max int を単独で追加すると (multiplfy を 2 倍するのと同じ)、次のようになります。
011111111111111111111111
+ 011111111111111111111111
__________________________
111111111111111111111110
111111111111111111111110
-2を表します。
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 に等しくなります。