Java为什么将long(64)转换为float(32)被视为加宽?

正如它从oracle说的那样

Oracle Docs的 参考资料

扩展原始转换19对基本类型的特定转换称为扩展原语转换:

  1. byte to short,int,long,float或double
  2. 短,int,long,float或double
  3. char到int,long,float或double
  4. int到long,float或double
  5. 长期漂浮或加倍
  6. 漂浮加倍

如果一个浮点数有32位而一个长数据有64位,那怎么算是加宽? 这不应该被视为缩小范围吗?

可以由floatdouble表示的值的范围远大于可以由long表示的范围。 虽然在从long转换为float时可能会丢失有效数字,但它仍然是一个“扩展”操作,因为范围更广。

从Java语言规范,§5.1.2 :

将int或long值扩展为float,或将long值转换为double,可能会导致精度损失 – 也就是说,结果可能会丢失该值的一些最低有效位。 在这种情况下,使用IEEE 754舍入到最接近模式(第4.2.4节)生成的浮点值将是整数值的正确舍入版本。

请注意, double可以精确地表示每个可能的int值。

它被认为是加宽的,因为floatdouble可以表示比long更大的值。 您可能会失去精度,但可以表示该值(至少近似值)。

它被认为是加宽的,因为浮点数表示的数字大于可以用long表示的数字。 仅仅因为float使用32位精度并不意味着它可以表示的数字限制为2 ^ 32。

例如,float (float)Long.MAX_VALUE+(float)Long.MAX_VALUE大于Long.MAX_VALUE ,即使float的精度低于long。

如果你用简单的术语来看问题,那就是原始设计师如何表示数据

理想情况下,长度(64)的位深度大于浮点数(32)。 但浮动数据代表了使用科学概念 ,它允许代表相当大的范围

例:300 [原始号码]:3×102 [科学代表]


长:-2 ^ 63到2 ^ 63-1

浮点数:( – 3.4)* 10 ^ 38至(3.4)* 10 ^ 38

注意这里的Long(幂的2)Vs Float(10的幂)代表性差异允许float具有更高的范围

希望这是有帮助的