私が理解しているように、これらの型の 2 つを Java の算術演算 (たとえば double + int) でキャストすると、結果はより大きな型になります (この例では、結果は double になります)。同じサイズの 2 つの型で算術演算を行うとどうなりますか? int + float と long + double は何を与えるでしょうか? int と float はそれぞれ 4 バイトであり、long と double は 8 バイトであるためです。
6 に答える
これはすべて、JLSの2 進数プロモーション規則によって指定されます。http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2から:
演算子がバイナリ数値昇格をオペランドのペアに適用する場合、各オペランドは数値型に変換可能な値を示す必要があります。次の規則が順番に適用されます。
オペランドが参照型の場合は、ボックス化解除変換 (§5.1.8) の対象となります。
拡張プリミティブ変換 (§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)
(「値セットの変換」とは、浮動小数点表現間のマッピングに関するものです。)
int
+float
が表示されます(がデフォルトで使用されるため、float
結果をにキャストする必要があることに注意してください)。+はあなたに与えます。float
double
long
double
double
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でテスト済み)。
この「プロモーション」の落とし穴は、long
+float
がフロートを使用するように「拡大」することです。
例えば
System.out.println(1111111111111111111L + 0.0f);
System.out.println(1111111111111111111L + 0.0);
プリント
1.11111113E18
1.11111111111111117E18
ロングフロートを扱う場合、幅の広いタイプが得られず、予想よりも精度が低下する可能性があります。
"bigger"
値全体を保持できる型を返す予定です。あなたの特定の質問で
int と float の間に + を作成すると、戻り値は float になり、long + double は double を返します。
加算演算子の動作は、15.18.2+
で-
定義されています。JLS の数値型の加法演算子 (+ および -) 。最初にバイナリ数値昇格を実行すると述べています。
オペランドで 2 進数値昇格が実行されます。
これは、 5.6.2で定義されています。バイナリ数値昇格。実質的に、プリミティブの場合:
- いずれかのオペランドが double 型の場合、もう一方は double に変換されます。
- それ以外の場合、いずれかのオペランドが float 型の場合、もう一方は float に変換されます。
- それ以外の場合、いずれかのオペランドが long 型の場合、もう一方は long に変換されます。
- それ以外の場合、両方のオペランドが int 型に変換されます。