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_MASK
是 Long.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
。
如何将表示为有符号 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_MASK
是 Long.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
。