2015-10-05 76 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),得到的浮点值将是整数值的正确舍入版本。

相关问题