0

私が理解しているように、これらの型の 2 つを Java の算術演算 (たとえば double + int) でキャストすると、結果はより大きな型になります (この例では、結果は double になります)。同じサイズの 2 つの型で算術演算を行うとどうなりますか? int + float と long + double は何を与えるでしょうか? int と float はそれぞれ 4 バイトであり、long と double は 8 バイトであるためです。

4

6 に答える 6

10

これはすべて、JLSの2 進数プロモーション規則によって指定されます。http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2から:

演算子がバイナリ数値昇格をオペランドのペアに適用する場合、各オペランドは数値型に変換可能な値を示す必要があります。次の規則が順番に適用されます。

  1. オペランドが参照型の場合は、ボックス化解除変換 (§5.1.8) の対象となります。

  2. 拡張プリミティブ変換 (§5.1.2) は、次の規則で指定されているように、オペランドの一方または両方を変換するために適用されます。

    • いずれかのオペランドが double 型の場合、もう一方は double に変換されます。

    • それ以外の場合、いずれかのオペランドが float 型の場合、もう一方は float に変換されます。

    • それ以外の場合、いずれかのオペランドが long 型の場合、もう一方は long に変換されます。

    • それ以外の場合、両方のオペランドが int 型に変換されます。

型変換があれば、値セット変換 (§5.1.13) が各オペランドに適用されます。

バイナリ数値昇格は、特定の演算子のオペランドで実行されます。

  • 乗法演算子 *、/、および % (§15.17)

  • 数値型 + および - の加算および減算演算子 (§15.18.2)

  • 数値比較演算子 <、<=、>、および >= (§15.20.1)

  • 数値等価演算子 == および != (§15.21.1)

  • 整数のビット演算子 &、^、および | (§15.22.1)

  • 場合によっては、条件演算子 ? : (§15.25)

(「値セットの変換」とは、浮動小数点表現間のマッピングに関するものです。)

于 2012-05-09T13:15:57.510 に答える
2

int+floatが表示されます(がデフォルトで使用されるため、float結果をにキャストする必要があることに注意してください)。+はあなたに与えます。floatdoublelongdoubledouble

于 2012-05-09T13:15:45.823 に答える
0

http://www.programmersheaven.com/2/FAQ-JAVA-Type-Conversion-Castingにある型変換に関する2つの興味深いFAQがあります。

http://myhowto.org/java/60-understanding-the-primitive-numeric-type-conversions-in-java/

同じサイズの2つのタイプについて質問に答えると、戻り値は最も精度の高いタイプになります。

次のコードを試してください。

public static void main(String[] args) {
    int i=1;
    float f=2.5f;
    long l=10;
    double d=3.74;
    System.out.println(i+f);
    System.out.println(f+i);
    System.out.println(l+d);
    System.out.println(d+l);
}

結果は3.5と13.74であり、それぞれfloatとdoubleです(Netbeans6.9とjava1.6でテスト済み)。

于 2012-05-09T13:25:01.973 に答える
0

この「プロモーション」の落とし穴は、long+floatがフロートを使用するように「拡大」することです。

例えば

System.out.println(1111111111111111111L + 0.0f);
System.out.println(1111111111111111111L + 0.0);

プリント

1.11111113E18
1.11111111111111117E18

ロングフロートを扱う場合、幅の広いタイプが得られず、予想よりも精度が低下する可能性があります。

于 2012-05-09T13:25:07.340 に答える
0

"bigger"値全体を保持できる型を返す予定です。あなたの特定の質問で

int と float の間に + を作成すると、戻り値は float になり、long + double は double を返します。

于 2012-05-09T13:16:54.240 に答える
0

加算演算子の動作は、15.18.2+-定義されています。JLS の数値型の加法演算子 (+ および -) 。最初にバイナリ数値昇格を実行すると述べています。

オペランドで 2 進数値昇格が実行されます。

これは、 5.6.2で定義されています。バイナリ数値昇格。実質的に、プリミティブの場合:

  • いずれかのオペランドが double 型の場合、もう一方は double に変換されます。
  • それ以外の場合、いずれかのオペランドが float 型の場合、もう一方は float に変換されます。
  • それ以外の場合、いずれかのオペランドが long 型の場合、もう一方は long に変換されます。
  • それ以外の場合、両方のオペランドが int 型に変換されます。
于 2012-05-09T13:18:03.407 に答える