2017-05-18 121 views
0

x + y的數據類型是什麼?需要幫助瞭解爲什麼此代碼不能編譯

double x = 39.21;

float y = 2.1;

說明:

這實際上是一個有趣的問題,因爲這個代碼將無法編譯!至於 你可能還記得從第1章開始,浮點文字被認爲是 是雙倍的,除非用f後綴,如2.1f所示。如果值爲 正確設置爲2.1f,那麼促銷將類似於最後的 示例,其中兩個操作數都被提升爲雙倍,並且結果 將是雙倍值。

但我不明白。如果float y = 2.1;被假定爲雙倍的 將不需要將雙倍變量y提升。 而我更加困惑的是下一個問題,它是:

x * y/z的數據類型是什麼?

short x = 14; float y = 13;雙z = 30;

這本書說,這將編譯甚至浮動y = 13;不是float y = 13f。如果它們是小數點,我只在浮點數旁邊加f嗎?我真的看不出這個問題和上述問題的區別。

+4

y被分配爲浮動。字面表達式「2.1」(沒有明確的尾部f)是雙精度。它不會編譯,因爲你不能在較小的浮點數中填入較大的雙精度值。 –

+1

但是,您可以將int 13分配給浮點數,因爲int可以提升爲浮點數。 –

+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,取其來自操作者的兩個值最接近的,即結果將永遠byteshort。例如:byte + short將推動雙方到int。詳情請參閱JLS §5.6.2. Binary Numeric Promotion

賦值操作符也會做拓寬值轉換,用額外的規則byte類型,short常量表達式,或int會經過narrowing conversion如果變量的類型是byteshort,並且常量表達式的值可以在類型中表示。請注意,沒有規定將double縮小到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

對於第一個問題,您不能初始化一個浮點數(使用double值)作爲double值。使用2.1f將該值初始化爲浮點值。所以你需要y = 2.1f。你可以閱讀更多關於here

對於第二個問題,這個原因的工作原理是浮點數是一個整數(13),它可以被提升爲float類型。

+0

*「浮子一個整數「*?你的意思是「*值*是一個整數」 – Andreas

0

正如此post所述,如果您未在數字後面指定字符'f',則該值將被視爲雙精度值。

就這樣說,下面的代碼段將被編譯,但只有當字符'f'被添加到浮點值的末尾時。

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

你是對的,我錯過了解釋我的理解。請原諒我。 – Koshux

+0

但如果y的值作爲雙進行處理,則不宜X + Y仍然可以工作,因爲它是雙+雙? – user3000482

+0

@MadPhysicist答案正確地解釋它。 – Koshux