Java中浮点的无符号整数

Java中浮点的无符号整数,java,unsigned,Java,Unsigned,在Java中,如何将表示为有符号Java等价物的无符号int或long转换为float或double?我在googleguava库()中找到了一些提示,但我不理解实现背后的原因。下面是将存储在值中的无符号long转换为float的代码片段: 198 @Override 199 public float floatValue() { 200 @SuppressWarnings("cast") 201 float fValue = (float) (value & UNSIG

在Java中,如何将表示为有符号Java等价物的无符号int或long转换为float或double?我在googleguava库()中找到了一些提示,但我不理解实现背后的原因。下面是将存储在
值中的无符号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  }
198@覆盖
199公众浮动价值(){
200@SuppressWarnings(“强制转换”)
201浮点值=(浮点)(值和无符号屏蔽);
202如果(值<0){
203 fValue+=0x1.0p63f;
204    }
205返回fValue;
206  }

据我所知,第一次检查是必要的,以检查值是否为负值,因为
无符号\u掩码
长的。最大\u值
。在本例中,转换与long-to-float转换的Java语义相匹配。但是,如果值为负数,为什么要添加常量呢?

如果要将原始long
值看作是无符号的,那么如果有符号的值为负数,则必须添加2^63以说明符号位

如果原始的
值已经为正,则无需添加任何内容,因为符号位为0,因此只需考虑底部63位的值

例如,以
1111…111111
(64 1位)为例

此长数字的有符号值为
-1

但是,无符号值是
2^63+2^62+…+2^1+2^0

(float)(value&UNSIGNED\u MASK)
将为您提供
2^62+2^61+…+2^1+2^0的浮点值

因此,您必须添加
2^63