Java和Python在将十六进制转换为long时返回不同的值

q9rjltbz  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(228)

在比较Python和Java语言中的xxhash实现时,我注意到了这种差异。由xxhash库计算的哈希值与十六进制字符串相同,但当我试图将计算的哈希值作为整数(或长)值时,它们是不同的。
我确信这是某种“端序”问题,但我找不到如何为两种语言获得相同的整数值。
你知道这是怎么发生的吗?

Java代码:

String hexString = "d24ec4f1a98c6e5b";
System.out.println(new BigInteger(hexString,16).longValue());
// printed value -> -3292477735350538661

Python代码:

hexString = "d24ec4f1a98c6e5b"
print(int(hexString, 16))
# printed value -> 15154266338359012955
zxlwwiss

zxlwwiss1#

您将BigInteger转换为long,这就是差异的原因。因为long是一个有符号的64位整数,它溢出为负数。如果你只是打印BigInteger,它会给出相同的结果。

System.out.println(new BigInteger(hexString,16));
# 15154266338359012955
w6lpcovy

w6lpcovy2#

结果是太大了,无法放入一个长的,并溢出。BigInteger.longValue()的文档:
将此BigInteger转换为长整型。此转换类似于Java™语言规范的第5.1.3节中定义的从long到int的收缩原语转换:如果这个BigInteger太大而不能放入long中,则只返回低64位。请注意,此转换可能会丢失有关BigInteger值的整体大小的信息,并返回符号相反的结果。

相关问题