Java中的原始强制转换和赋值

时间:2014-09-25 19:29:18

标签: java casting primitive

为什么以下工作

float f = 10l // OK  32 bits to 64 ?

float只有32位且长64位,所以在长

中没有浮动空间

而且这个不是

long l = 10f    //compile error 

有人可以向我解释一下铸造是如何起作用的吗?

3 个答案:

答案 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上的文档。

longfloat是一个扩大的转化,floatlong是一个缩小的转化。

一般来说,扩大转化是安全的,因为您转换为的内容总是可以采用较窄类型可能会抛出的任何值。缩小转化次数总是安全的,因为您可能会销毁信息或以NaN结束。

答案 2 :(得分:0)

第一次初始化是widening primitive conversion

第二次初始化是narrowing conversion。可能会丢失信息。考虑如果您尝试分配long l = 10.5f会发生什么 - 整数类型不能代表小数部分。