Java中的无符号整数到浮点

时间:2015-10-20 08:49:19

标签: java unsigned

如何在Java中将unsigned int或long表示为带符号的Java等效项转换为float或double?我在Google Guava库中找到了一些提示(Link),但我不明白实施背后的原因。下面是将value中存储的unsigned long转换为float:

的代码片段
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语义。但是,如果值是负数,为什么会增加一个常量呢?

1 个答案:

答案 0 :(得分:2)

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