long a2 = 100L * 1024 * 1024 * 1024;
ただし、この操作では少なくとも 1 つのオペランドは long
. 。したがって、演算は 64 ビット精度を使用して実行され、数値演算子の結果は次の型になります。 long
. 。他の非長いオペランドはタイプに広がっています long
による 数値的なプロモーション 結果の値は変数に格納されます a2
.
long a1 = 100 * 1024 * 1024 * 1024;
単純な整数の定数式。式の結果は型として計算されます。 int
. 。ただし、計算された値が大きすぎて整数に収まらないためオーバーフローし、次のような結果が得られます。 0
に保存されます a1
変数。
編集:次のコメントで尋ねられているように:
なぜマイナスにならないのでしょうか?
なぜなら、中にいる間は 整数計算 2 番目の計算は次と同等です 25 * 2^32
どこ ^
パワーの意味があり、 2^32
整数値は 0
. 。ただし、なぜその価値があるのかを説明すると、 0
:バイナリでは:
100 * 1024 * 1024 * 1024 == 25 * 2^32;
Integer.MAX_VALUE = 2 ^ 31 -1 = 0 11111111 11111111 11111111 1111111
Integer.MAX_VALUE + 1 = 2 ^ 31 = 1 00000000 00000000 00000000 0000000
2 ^ 31
は負の整数(-2147483648
) 符号ビットとして 1
それゆえ 2 ^ 32
は単なる乗算です 2
に 2 ^ 31
:左シフトすると、符号ビットは次のようになります 0
したがって、結果は次のようになります 0
.
をチェックしてください java language specification: 4.2.2: Integer operation
詳細については。