3

リテラル番号のキャストとリテラル番号の接尾辞の使用に大きな違いはありますか?

説明する...

doSomethingWithLong(2L); //vs...
doSomethingWithLong((long) 2);

明確にするために:コードが使用されているリテラル値でコンパイルされると仮定しましょう。

4

3 に答える 3

8

最初のものでは、longリテラルを使用しています。integer2番目のものでは、リテラルを 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
于 2013-09-05T14:48:30.503 に答える
8

あなたはコンパイルすることができません

 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のバイトコードの回答を参照してください。

于 2013-09-05T14:48:32.323 に答える
0

コンパイルされていない特定のものは別として、注意しないと予期しない結果が生じる可能性があります - 5d/2d は 2.5 を返します 5/2 は 2 を返します

于 2013-09-05T14:52:48.703 に答える