在Java中扩展类型转换

时间:2015-02-18 13:55:06

标签: java casting

Herbert Schild在 Java初学者指南中说明:

  

如果(a)两种类型兼容且(b)目标类型大于源类型

,则会发生自动类型转换

但是:然后他将long转换为double,因此违反了(b),因为64位整数明显大于32位类型。起初这有点令人困惑和违反直觉。

不应该将条件提炼为

  

目标类型大于或小于源类型,因为只有在没有数据丢失的情况下才会进行此类转换,因为目标类型足够大以容纳源数据类型?

3 个答案:

答案 0 :(得分:1)

doublelong都是64位。但是,将64位整数分配给double可能会导致精度损失,这就是需要显式强制转换的原因。因此,在这种情况下不会发生自动类型转换。

答案 1 :(得分:1)

答案 2 :(得分:0)

这种转换称为加宽转换,可能导致精度损失但是允许。

查看类似问题的已接受答案

Why does Java implicitly (without cast) convert a `long` to a `float`?

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

  

将int或long值的扩展转换为float或long   值加倍,可能导致精度损失 - 即结果   可能会丢失该值的一些最低有效位。在这   case,生成的浮点值将是正确舍入的   版本的整数值,使用IEEE 754舍入到最接近模式

     

long :长数据类型是64位二进制补码整数。该   signed long的最小值为-263,最大值为263-1。   在Java SE 8及更高版本中,您可以使用长数据类型来表示   无符号64位长,最小值为0,最大值为0   值为264-1。需要一系列值时,请使用此数据类型   比int提供的更广泛。 Long类还包含方法   比如compareUnsigned,divideUnsigned等支持算术   无符号长的操作。

     

double :双数据类型是双精度64位IEEE 754   浮点。它的价值范围超出了这个范围   讨论,但在浮点类型,格式和   Java语言规范的值部分。对于十进制值,   此数据类型通常是默认选择。正如刚才提到的,   永远不要将此数据类型用于精确值,例如   货币。