リテラル番号のキャストとリテラル番号の接尾辞の使用に大きな違いはありますか?
説明する...
doSomethingWithLong(2L); //vs...
doSomethingWithLong((long) 2);
明確にするために:コードが使用されているリテラル値でコンパイルされると仮定しましょう。
リテラル番号のキャストとリテラル番号の接尾辞の使用に大きな違いはありますか?
説明する...
doSomethingWithLong(2L); //vs...
doSomethingWithLong((long) 2);
明確にするために:コードが使用されているリテラル値でコンパイルされると仮定しましょう。
最初のものでは、long
リテラルを使用しています。integer
2番目のものでは、リテラルを a にキャストしていlong
ます。
値が大きすぎてint
型に格納できない場合、それらは同じように動作しません。たとえば、2番目のコードは、 よりも大きいInteger.MAX_VALUE
、または よりも小さい値ではコンパイルされませんInteger.MIN_VALUE
。
整数リテラルで算術演算を実行するときも、十分に注意する必要があります。算術演算の結果が範囲外になると、予期しない結果になることがあります。例:
System.out.println(123456 * 123456); // Will print `-1938485248`
関連記事:
使用されているリテラル値でコードが引き続きコンパイルされると仮定しましょう。
コードがコンパイルされるリテラルがあると仮定すると、バイトコードに違いはありません。上記の 2 つの呼び出しは、以下に示すように同じバイトコードを生成します。コマンドを使用javap -c YourClass
してバイトコードを表示できます。
0: ldc2_w #2 // long 2l
3: invokestatic #4 // Method doSomethingWithLong:(J)V
6: ldc2_w #2 // long 2l
9: invokestatic #4 // Method doSomethingWithLong:(J)V
あなたはコンパイルすることができません
doSomethingWithLong((long) 222222222222222222);
// The literal 222222222222222222 of type int is out of range
222222222222222222
に収まらないからですint
。
プリミティブ データ型については、この公式の Java チュートリアルを参照してください。
int データ型は、32 ビットの符号付き 2 の補数整数です。最小値は -2,147,483,648 で、最大値は 2,147,483,647 (包括的) です。
long データ型は、64 ビットの符号付き 2 の補数整数です。最小値は -9,223,372,036,854,775,808 で、最大値は 9,223,372,036,854,775,807 (包括的) です。
使用されているリテラル値でコードが引き続きコンパイルされると仮定しましょう。
それらは同等です。Rohitのバイトコードの回答を参照してください。
コンパイルされていない特定のものは別として、注意しないと予期しない結果が生じる可能性があります - 5d/2d は 2.5 を返します 5/2 は 2 を返します