2012-03-18 192 views
2

我正在用BigIntegers隨機值進行試驗。BigInteger.toByteArray()在java中返回奇怪的值

BigInteger bi1 = new BigInteger("365375409332725729550921208179070754913983135742"); 
BigInteger bi2 = new BigInteger("386718480727050819604290866521372728863001258687"); 

byte[] bytesBi1 = bi1.toByteArray(); 
byte[] bytesBi2 = bi2.toByteArray(); 

第一個是產生奇怪值的那個。 第二是好的。

有人可以向我解釋我做錯了什麼嗎?

編輯

我這裏還有結果:

bytesBi1 = [63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2] 
bytesBi2 = [67, -67, 14, 113, -94, 16, -120, 82, 84, 95, -127, -124, -90, -33, 29, -102, 90, 125, -86, -65] 
+7

你是什麼意思與「奇怪的價值」。你能否詳細說明一下,可能會展示一些代碼。乾杯! – SimonSez 2012-03-18 23:24:58

+2

你的意思是它給出了數組中的負數?如果是這樣,這是因爲Java中的字節是帶符號的字節。 – 2012-03-18 23:34:07

+0

我編輯帖子以包含結果。我不明白爲什麼bytesBi1有這個值。 – 2012-03-18 23:56:03

回答

1

BigIntegertoByteArray()方法返回數字的two's complement表示形式。

你得到的值實際上你把數字的正確二進制補碼錶示。

-1

我測試了給定數量的與我自己的實現任意精度的數字。 字節值是完全正確的,所以它可能是簡單的情況下,隨機數發生器搞砸了,質量差或你有一些非凡的離羣值。

0

這是bi1十六進制內部表示,你可以看到它在調試器

mag[0] = 3FFFFFFF 
mag[1] = FFFFFFFF 
mag[2] = FFFFFFFF 
mag[3] = FFFFFFFF 
mag[4] = 00000001 

如果您將4個字節中的每個雙字分開,並且您將的補碼的每個字節,您得到您的數字。

如第一個行:mag[0] = 3F,FF,FF,FF至極變成63, -1 ,-1,-1十進制

所以沒有錯,你的輸出。