为什么以下工作
float f = 10l // OK 32 bits to 64 ?
float只有32位且长64位,所以在长
中没有浮动空间而且这个不是
long l = 10f //compile error
有人可以向我解释一下铸造是如何起作用的吗?
答案 0 :(得分:2)
long
特别允许从float
转换为long l = 10f;
:
对原始类型的19个特定转换称为扩展原语转换:
byte to short,int,long,float或double
缩短为int,long,float或double
char to int,long,float或double
int to long,float或double
长期漂浮或加倍
float to double
和
从int到float,或从long到float,或从long到double的扩展原语转换可能导致精度损失 - 也就是说,结果可能会丢失该值的一些最低有效位。在这种情况下,使用IEEE 754舍入到最接近模式(第4.2.4节),得到的浮点值将是整数值的正确舍入版本。
因此,涵盖了值的范围,但可能会丢失精度。这是允许的和预期的。
另一行:
long l = (long) 10f; // Compiles
是JLS, Section 5.1.2,而primitive narrowing conversion并非明确允许:
分配上下文允许使用以下之一:
身份转换(第5.1.1节)
扩大原始转换(第5.1.2节)
扩大参考转换(第5.1.5节)
拳击转换(§5.1.7),可选地后跟扩展参考转换
一个拆箱转换(第5.1.8节),可选地后跟一个加宽的原语转换。
请注意,显式转换将允许缩小基元转换。
{{1}}
答案 1 :(得分:0)
您可能正在寻找widening primitive conversions, and narrowing primitive conversions上的文档。
long
到float
是一个扩大的转化,float
到long
是一个缩小的转化。
一般来说,扩大转化是安全的,因为您转换为的内容总是可以采用较窄类型可能会抛出的任何值。缩小转化次数不总是安全的,因为您可能会销毁信息或以NaN
结束。
答案 2 :(得分:0)
第一次初始化是widening primitive conversion。
第二次初始化是narrowing conversion。可能会丢失信息。考虑如果您尝试分配long l = 10.5f
会发生什么 - 整数类型不能代表小数部分。