【问题标题】:Unsigned Integers to Floating Point in JavaJava中的无符号整数到浮点数
【发布时间】:2015-10-20 08:49:18
【问题描述】:

如何在 Java 中将表示为已签名 Java 等效项的 unsigned 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,因此必须首先检查该值是否为负数。在这种情况下,转换与从 long 到 float 转换的 Java 语义相匹配。但是,如果值为负,为什么要添加一个常量呢?

【问题讨论】:

    标签: java unsigned


    【解决方案1】:

    如果您希望将原始 long value 视为无符号,如果有符号值为负,则必须添加 2^63 以说明符号位。

    如果原来的value已经是正数,就不用加了,因为符号位是0,所以只考虑低63位的值。

    例如取1111...111111(64个1位)。

    这个长数的有符号值为-1

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

    (float) (value &amp; UNSIGNED_MASK) 将为您提供 2^62+2^61+...+2^1+2^0 的浮点值。

    因此你必须添加2^63

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 2014-11-05
      • 2018-04-20
      • 1970-01-01
      • 2013-11-01
      • 2011-05-29
      • 2011-05-25
      相关资源
      最近更新 更多