有人可以向我解释在使用public BigInteger(byte[] val)
时,两个边缘但非平凡的不同字节数组会产生相同的BigInteger吗?
怎么可能......
import java.math.BigInteger;
public class BigIntegerTest
{
public static void main(String[] args)
{
BigInteger a = new BigInteger(new byte[] {-1, -1, -1, -1, 123});
BigInteger b = new BigInteger(new byte[] {-1, 123});
System.out.println(a.toString(16)+" .equals "+b.toString(16)+" ? "+(a.equals(b)));
}
}
...打印真实吗?
我确定我误解了JavaDocs,但我没看到。我会检查来源......但是,呃,我找不到它。
我错过了什么?
答案 0 :(得分:2)
第一个包含与第二个相同的值以及左侧的大量符号扩展。
答案 1 :(得分:0)
当您使用new BigInteger(byte[]);
时,它首先在字节数组中找到非签名字节,然后收集有符号字节以获取数字值。
在两个示例中,非签名字节相同,即123
。有符号字节也相同,即-1
。唯一的区别是,在第一个示例中,您有一些额外的符号字节被忽略。
收集有符号和无符号字节后,您的两个号码都代表相同的BigInteger value
,因此equals
会产生true
。