2015-10-05 63 views
0

當我執行下面的代碼時,我期望它得到警告「不能從long轉換爲float」,因爲float是32位,long是64位大小。 但看起來沒有警告, 任何人都可以解釋我怎麼樣?爲什麼編譯器在給float賦值時不會給出錯誤?

public static void main(String[] args) 
{ 
    float a=1; 
    long b=123; 
    a=b; 
    System.out.println(a); 
} 
+0

如果float不能保持賦值,那麼它會溢出/下溢 –

+2

@MohammadAdil:它可能無法保存* exact *值(在這種情況下它會舍入),但它不會溢/下溢。 –

+0

通過定義擴展意味着將類型轉換爲更寬範圍的類型(儘管可能精度更低)當擴展時,不可能出現下溢或溢出。 –

回答

5

float範圍比的long範圍大得多......有可能會失去精度的隱式轉換,而不是幅度。 longdouble也是如此。

JLS 5.1.2

加寬原語轉換從intfloat,或從longfloat,或從longdouble,可能導致精度損耗 - 即,其結果可能會失去一些值的最低有效位。在這種情況下,使用IEEE 754輪到最近模式(§4.2.4),得到的浮點值將是整數值的正確舍入版本。

相關問題