Java 中的无符号整数到浮点数

Unsigned Integers to Floating Point in Java

如何将表示为有符号 Java 等价物的无符号整数或长整型转换为 Java 中的浮点数或双精度数?我在 Google Guava 库 (Link) 中找到了一些提示,但我不明白实现背后的原因。这是将存储在 value 中的无符号长整数转换为浮点数的代码片段:

198  @Override
199  public float floatValue() {
200    @SuppressWarnings("cast")
201    float fValue = (float) (value & UNSIGNED_MASK);
202    if (value < 0) {
203      fValue += 0x1.0p63f;
204    }
205    return fValue;
206  }

据我了解,由于 UNSIGNED_MASKLong.MAX_VALUE,所以第一次检查是必要的,以检查该值是否不为负。在这种情况下,转换匹配 long 到 float 转换的 Java 语义。但是为什么要加一个常量,如果是负数呢?

如果您希望将原始 long value 视为无符号,如果有符号值为负,则必须添加 2^63 以说明符号位。

如果原来的value已经是正数,就不用加了,因为符号位是0,所以只需要考虑低63位的值。

例如取1111...111111(64个1位).

这个长数的有符号值为-1

然而,无符号值是2^63+2^62+...+2^1+2^0

(float) (value & UNSIGNED_MASK) 会给你 2^62+2^61+...+2^1+2^0.

的浮点值

因此您必须添加 2^63