Java中浮点的无符号整数
在Java中,如何将表示为有符号Java等价物的无符号int或long转换为float或double?我在googleguava库()中找到了一些提示,但我不理解实现背后的原因。下面是将存储在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
值中的无符号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