2012-10-27 28 views
0

有人可以向我解释当使用public BigInteger(byte[] val)时,两个边缘但非平凡的不同字节数组可以产生相同的BigInteger吗?不同的字节[] =>相同的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,但是我不知道它在哪里。我会检查来源......但是,呃,我找不到它。

我错过了什么?

+2

酱汁:http://www.docjar.org/html/api/java/math/BigInteger.java.html#171 –

+0

谢谢!在2862行找到我需要的东西。这些资源的官方程度如何?我似乎记得能够从Sun下载源代码,但Oracle只会将我指向OpenJDK。 – DowntroddenCodeMonkey

+0

这两个是相同的原因,150是相同的0150. –

回答

0

当您使用new BigInteger(byte[]);时,首先找到字节数组中的无符号字节,然后收集有符号字节以获取数字值。

在这两个示例中,无符号字节都是相同的,即123。带符号的字节也是相同的,即-1。唯一的区别是在第一个例子中,你有一些额外的符号字节被忽略。

收集签名和非符号字节后,两个您的数字都代表相同BigInteger value因此equals被所得成true

+0

行。现在我明白发生了什么,但我不明白为什么。不'转换包含二进制补码二进制表示的字节数组'表明只有第一个字节的第7位是符号位?任何为什么它会忽略以下-1而不是将它们视为数据? – DowntroddenCodeMonkey

+0

@DowntroddenCodeMonkey:“它基于任何给定数字只有一个有符号字节的事实。内部实现是使用事实完成的。你的例子是“制约合同,因此意外的行为,这是正确的。它的溢出行为类似。当您分配的数量大于容量时,您会收到意外的行为。如果你把'除了一个以外的其他字节改为+ ve',你的数字'不匹配'。 –

+0

啊哈!我不知道这个合同。我天真地认为'public BigInteger(byte [] val)'可以带**任意**任意字节[]并返回一个唯一的BigInteger。谢谢!绿色勾号我会给你。 – DowntroddenCodeMonkey

2

第一个包含与第二个值相同的值以及左侧的大量符号扩展。

相关问题