如何在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_MASK
为Long.MAX_VALUE
,因此必须首先检查该值是否为负数。在这种情况下,转换匹配long到float转换的Java语义。但是,如果值是负数,为什么会增加一个常量呢?
答案 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
。