Java 为什么将长(64)转换为浮点(32)被认为是加宽的?

2022-09-03 04:38:56

正如它从预言机中所说的那样

来自 Oracle Docs 的参考

加宽基元转换 基元类型的 19 种特定转换称为加宽基元转换:

  1. 字节到短整型、整型、长整型、浮点型或双精度型
  2. 短到整型、长整型、浮点型或双精度型
  3. 字符到整型、长整型、浮动型或双精度型
  4. 整型到长整型、浮点型或双精度型
  5. 长到漂浮还是加倍
  6. 浮点到双倍

如果浮子有32位,而长线有64位,这怎么能算是加宽?这难道不应该被认为是缩小范围的吗?


答案 1

可由 或 表示的值的范围远大于 可由 表示的值的范围。虽然在从 a 转换为 a 时可能会丢失有效数字,但它仍然是一个“加宽”操作,因为范围更宽。floatdoublelonglongfloat

摘自 Java 语言规范 §5.1.2

将整数或长整型值加宽转换为浮点型,或将长整型值加宽转换为双精度,可能会导致精度损失,也就是说,结果可能会丢失值中一些最低有效位。在这种情况下,生成的浮点值将是整数值的正确舍入版本,使用 IEEE 754 舍入到最近模式 (§4.2.4)。

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


答案 2

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

例如,浮子大于 ,即使浮点数的精度低于长。(float)Long.MAX_VALUE+(float)Long.MAX_VALUELong.MAX_VALUE


推荐