2012-03-18 193 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十进制

所以没有错,你的输出。