long oneYearWithL = 1000*60*60*24*365L;
long oneYearWithoutL = 1000*60*60*24*365;
最初の値は実際には long です (365Lは でlongあり1000*60*60*24、であるため、値を持つ値の結果integerは値です。multiplyinglongintegerlong
しかし、2番目の値は整数です(integer値にinteger値のみを掛けているため、結果は整数になり32-bitます。そのために得られた結果multiplicationは、整数の実際の範囲外です。したがって、変数に割り当てられる前に、有効な整数範囲に収まるように切り捨てられます。
次の print ステートメントを見てください: -
System.out.println(1000*60*60*24*365L);
System.out.println(1000*60*60*24*365);
System.out.println(Integer.MAX_VALUE);
上記のコードを実行すると: -
出力: -
31536000000
1471228928
2147483647
だから、あなたは違いを見ることができます..
011101010111101100010010110000000000 -- Binary equivalent of 1000*60*60*24*365L
01111111111111111111111111111111 -- Binary equivalent of Integer.MAX_VALUE
したがって、番号の最後にそれを追加しないとL、最上位 4 ビットが最初のバイナリ文字列から削除されます..
したがって、文字列は..
(0111)01010111101100010010110000000000 -- Remove the most significant bits..
01010111101100010010110000000000 -- Binary equivalent of 1471228928
(出力として取得します)
更新: -上記の説明から、最初の割り当てであっても、乗算する前multiplicationの結果が範囲外になる場合、整数範囲に収まるように切り捨てられるか、に変換される
ことも理解できます。必要に応じて、それのみが で乗算されます。integers365L2's complement representationlong value - 365L
例: -
long thirtyYearWithL = 1000*60*60*24*30*365L;
上記の例では、最初の部分 - を考えてみましょう1000*60*60*24*30。この乗算の結果は次のとおり2592000000です。では、それがどのように表されているか見てみましょうbinary equivalent: -
2592000000 = 10011010011111101100100000000000 -- MSB is `1`, a negative value
01100101100000010011100000000001 -- 2's complement representation
表現の10進表現2's complementは です1702967297。したがって、はに乗算される前に に2592000000変換されます。これ以降、この値は : -に収まるため、それ以上切り捨てられることはありません。-1702967297365Linteger range[-2147483648 to 2147483647]
したがって、実際の結果は次のようになります。
long thirtyYearWithL = 1000*60*60*24*30*365L;
= 2592000000 * 365L;
= -1702967297 * 365L = -621583063040
typeしたがって、これらすべてのものは、算術演算を適用する際の最終結果の実際を考慮するだけです。そして、このチェックは、移動元の操作の一時的な結果ごとに実行されますleft to right(結合性を持つ演算子を考慮しleft-to-rightて)。一時的な結果が範囲外であることが判明した場合は、次の操作に進む前に、必要な範囲に収まるように適宜変換されます。
更新 2: -
したがって、代わりに: -
long thirtyYearWithL = 1000*60*60*24*30*365L;
最初に移動する365Lと、正しい結果が得られます: -
long thirtyYearWithL = 365L*1000*60*60*24*30; // will give you correct result
なぜなら、あなたのtemporary結果は typelongになり、その値を保持できるからです。