2012-10-27 63 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

第一個包含與第二個值相同的值以及左側的大量符號擴展。

相關問題