Java中将无符号整数转换为浮点数

3
我该如何在Java中将表示为有符号Java等效项的无符号int或long转换为float或double?我在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。在这种情况下,转换符合Java中long到float的语义。但如果值为负数,为什么要添加一个常量?
1个回答

3

如果您希望将原始的长整型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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接