long oneYearWithL = 1000*60*60*24*365L;
long oneYearWithoutL = 1000*60*60*24*365;
最初の値は実際には long です (365L
は でlong
あり1000*60*60*24
、であるため、値を持つ値の結果integer
は値です。multiplying
long
integer
long
しかし、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
の結果が範囲外になる場合、整数範囲に収まるように切り捨てられるか、に変換される
ことも理解できます。必要に応じて、それのみが で乗算されます。integers
365L
2's complement representation
long 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
変換されます。これ以降、この値は : -に収まるため、それ以上切り捨てられることはありません。-1702967297
365L
integer 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
になり、その値を保持できるからです。