char
無視して、Javaは次のように数値型を推進していきます。これらは、拡大変換
byte > short > int > long > float > double
と呼ばれています。詳細については、JLS §5.1.2. Widening Primitive Conversionを参照してください。
二項演算子は、演算子の二つの値から最も近い方、int
、long
、float
、またはdouble
を促進する、すなわち結果はbyte
又はshort
なることはありません。例:byte + short
は、両側をint
に昇格させます。詳細については、JLS §5.6.2. Binary Numeric Promotionを参照してください。変数の型がある場合
代入演算子も定数式タイプbyte
、short
の、またはint
はnarrowing conversionを通過します余分なルールで、値の変換を広げるを行いますbyte
かshort
であり、定数式の値はその型で表現可能です。 を一定にしてfloat
に絞り込む規則はありません。詳細については、JLS §5.2. Assignment Contextsを参照してください。
だから、あなたのコードのために:コードがコンパイルされていた場合
double x = 39.21; // double constant to double (identity conversion)
float y = 2.1; // fails because double constant cannot promote to float
、x + y
のデータ型は何ですか?
x + y // double + float promotes to double
回答:double
次の部分:
今 short x = 14; // narrowing conversion of int constant to short
float y = 13; // widening conversion of int constant to float
double z = 30; // widening conversion of int constant to double
、x * y/z
のデータ型は何ですか?
x * y // short * float promotes to float
(x * y)/z // (float)/double promotes to double
回答:double
Yは、フロートとして割り当てられます。リテラル式 "2.1"(明示的に末尾のfを付けない)はdoubleです。小さなフロートに大きなダブルを埋めることができないため、コンパイルされません。 –
しかし、intを浮動小数点型に昇格できるので、浮動小数点型にint型の '13'を代入することはできます。 –
関連:http://stackoverflow.com/questions/28361456/why-explicit-type-casting-required-from-double-to-float-but-not-from-int-to-byte –