java中大的负十六进制值到长的转换

java中大的负十六进制值到长的转换,java,string,hex,long-integer,Java,String,Hex,Long Integer,结果应为负值,但为正值 我怎样才能解决这个问题 谢谢 BigInteger b=新的BigInteger(“80000000000000430800000000000”,16) System.out.println(“长值:+b.longValue()) --> 长值:483011600354856960 请参阅上面的页面,了解为什么它不会是负数。它返回低64位,因此最后64位必须高于Long.MAX_值才能产生负值。如果您总是有128位数字,并且假设最高位是符号,则可以使用以下行: BigIn

结果应为负值,但为正值

我怎样才能解决这个问题

谢谢

BigInteger b=新的BigInteger(“80000000000000430800000000000”,16)

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

--> 长值:483011600354856960


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

如果您总是有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的情况下才适用,而long可能不适用于如此大的数字。

您的字符串表示形式是有符号long,但将以无符号字符串的形式呈现给BigInteger(在字符串开头使用“-”表示符号)

要从字符串实例化中实现这一点,需要对字符串进行位移位或更正

我认为最好的答案是将字符串转换为字节数组,并使用实例化,该实例化将根据2的补码识别负数或正数。存在该字符串到字节数组的转换。你挑吧


。。。哦,而且你的数字太大,无法放入一个长的,所以这也将是一个问题;你得到的是最低有效位。

我不明白,为什么它应该是负数?@Nican他的数字实际上是从4开始的,并且可以放入一个长的数字中。我认为开头的8是试图用2的补码表示一个符号。@JeffFerland是BigNumber构造函数指定的,如果一个数字假定为负数,则必须在前面加上可选的“-”号。@Nican我在下面的回答中详细说明了收缩器的问题。只是在理论上解释询问者为什么期望负值。