2017-05-18 14 views
0

x + yのデータ型は?このコードがコンパイルされない理由を理解するための助けが必要

倍x = 39.21;

float y = 2.1;

説明:このコードはコンパイルされませんよう

これは、実際にはトリックの質問です! 第1章で覚えているように、浮動小数点リテラルは、2.1fのようにfを後置しないかぎり、 をdoubleと仮定しています。値が が2.1fに正しく設定されている場合、昇格は最後の の例に似ており、両方のオペランドが2倍に昇格され、結果は は2倍になります。

しかし、わかりません。 float y = 2.1の場合二重であると仮定されていたので、二重変数yの宣伝は必要ありません。 そして、私は次の問題で混乱しています。

x * y/zのデータ型は?

short x = 14; float y = 13;二重z = 30;

本書では、これはfloat y = 13でもコンパイルされます。 float y = 13fではありません。浮動小数点数が小数点以下の場合は、浮動小数点数の次にfを追加するだけですか?私は本当にこの問題と上記の問題の違いを見ることができません。

+4

Yは、フロートとして割り当てられます。リテラル式 "2.1"(明示的に末尾のfを付けない)はdoubleです。小さなフロートに大きなダブルを埋めることができないため、コンパイルされません。 –

+1

しかし、intを浮動小数点型に昇格できるので、浮動小数点型にint型の '13'を代入することはできます。 –

+0

関連:http://stackoverflow.com/questions/28361456/why-explicit-type-casting-required-from-double-to-float-but-not-from-int-to-byte –

答えて

3

char無視して、Javaは次のように数値型を推進していきます。これらは、拡大変換

byte > short > int > long > float > double 

と呼ばれています。詳細については、JLS §5.1.2. Widening Primitive Conversionを参照してください。

二項演算子は、演算子の二つの値から最も近い方、intlongfloat、またはdoubleを促進する、すなわち結果はbyte又はshortなることはありません。例:byte + shortは、両側をintに昇格させます。詳細については、JLS §5.6.2. Binary Numeric Promotionを参照してください。変数の型がある場合

代入演算子も定数式タイプbyteshort、またはintnarrowing conversionを通過します余分なルールで、値の変換を広げるを行いますbyteshortであり、定数式の値はその型で表現可能です。 を一定にして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

0

最初の質問では、float(double値)をdouble値として初期化することはできません。 2.1fを使用すると、その値が浮動小数点として初期化されます。したがって、y = 2.1fが必要です。あなたはそれについてもっと読むことができますhere

2番目の質問では、これが動作する理由はfloatがfloat型に昇格できる整数(13)です。

+0

* "floatは整数 "*?あなたは "*値*は整数です"を意味しました – Andreas

0

このpostに記載されているように、数字の後に文字 'f'を指定しないと、値は2重として扱われます。

これで、以下のコードはコンパイルされますが、文字 'f'が浮動小数点値の末尾に追加された場合にのみコンパイルされます。

double x = 7.0; 
float y = 2.0f; 
System.out.print(x + y); 
+0

あなたは正しいです、私はミスが私の理解を解釈しました。すみません。 – Koshux

+0

しかし、yの値がdoubleとして扱われるなら、x + yはdouble + doubleなのでまだ動作しないはずですか? – user3000482

+0

@MadPhysicistの答えが正しく説明しています。 – Koshux

関連する問題