Herbert Schild在 Java初学者指南中说明:
如果(a)两种类型兼容且(b)目标类型大于源类型
,则会发生自动类型转换
但是:然后他将long
转换为double
,因此违反了(b),因为64位整数明显大于32位类型。起初这有点令人困惑和违反直觉。
不应该将条件提炼为
目标类型大于或小于源类型,因为只有在没有数据丢失的情况下才会进行此类转换,因为目标类型足够大以容纳源数据类型?
答案 0 :(得分:1)
double
和long
都是64位。但是,将64位整数分配给double可能会导致精度损失,这就是需要显式强制转换的原因。因此,在这种情况下不会发生自动类型转换。
答案 1 :(得分:1)
实际上double也是64位大小。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
答案 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语言规范的值部分。对于十进制值, 此数据类型通常是默认选择。正如刚才提到的, 永远不要将此数据类型用于精确值,例如 货币。