【问题标题】:Large negative hex value conversion to long in javajava中大的负十六进制值转换为long
【发布时间】:2011-11-26 23:37:32
【问题描述】:

结果应该是负值,但它是正值。

我该如何解决这个问题?

谢谢!!

BigInteger b = new BigInteger("80000000000000004308000000000000", 16);

System.out.println("长值:"+b.longValue());

--> 长值:4830110600354856960

【问题讨论】:

  • 看不懂,为什么要负数?
  • @Nican 他的号码实际上以 4 开头,并且确实适合长。我认为开头的 8 是尝试使用二进制补码来表示符号。
  • @JeffFerland BigNumber 构造函数指定如果一个数字是负数,你必须把可选的“-”号放在前面。
  • @Nican 我在下面的回答中详细说明了该收缩器问题。只是对提问者期望负值的原因进行理论分析。

标签: java string hex long-integer


【解决方案1】:

http://download.oracle.com/javase/1,5,0/docs/api/java/math/BigInteger.html#longValue%28%29

请参阅上面的页面以了解为什么它不会是负面的。它返回低 64 位,因此您的最后 64 位必须高于 Long.MAX_VALUE 才能导致负值。

【讨论】:

    【解决方案2】:

    您的字符串表示形式是有符号长整数,但作为无符号字符串呈现给 BigInteger(符号在字符串开头使用“-”表示)。

    The String representation consists of an optional minus sign followed by a sequence of one or more digits in the specified radix.

    需要对字符串进行位移或更正才能从字符串实例化中进行这项工作。

    我认为最好的答案是将您的字符串转换为字节数组并使用BigInteger(byte[] val) 实例化,它将根据二进制补码识别负数或正数。 Many options 存在用于该字符串到字节数组的转换。任君挑选。

    ... 哦,你的数字太大了,不能放入一个 long 中,所以这也是一个问题;你得到最低有效位。

    【讨论】:

      【解决方案3】:

      如果您总是有 128 位数字并假设最高位是您的符号,那么您可以使用以下行:

      BigInteger neg = BigInteger.ONE.shiftLeft(127);
      BigInteger b = new BigInteger("80000000000000004308000000000000", 16);
      if(b.compareTo(neg) >= 0) { 
          b = neg.subtract(b); 
      }
      

      注意:b.longValue() 仅适用于位数适合 long 的情况,而这种情况可能不适用于如此大的数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-14
        • 2015-12-18
        • 1970-01-01
        • 2013-10-01
        • 1970-01-01
        • 2016-06-02
        • 2013-10-30
        • 1970-01-01
        相关资源
        最近更新 更多