在java中返回奇怪值的BigInteger.toByteArray()
我正在用随机值的大整数做实验在java中返回奇怪值的BigInteger.toByteArray(),java,bytearray,biginteger,Java,Bytearray,Biginteger,我正在用随机值的大整数做实验 BigInteger bi1 = new BigInteger("365375409332725729550921208179070754913983135742"); BigInteger bi2 = new BigInteger("386718480727050819604290866521372728863001258687"); byte[] bytesBi1 = bi1.toByteArray(); byte[] bytesBi2 = bi2.toByt
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]
我用自己实现的任意精度数字测试了给定的数字。
字节值是完全正确的,因此可能只是随机数生成器出错、质量不好或出现异常值的情况。我用自己实现的任意精度数字测试了给定的数字。 字节值完全正确,因此可能只是随机数生成器出错、质量不好或出现异常值。BigInteger的toByteArray方法返回数字的表示形式 您得到的值实际上是您输入的数字的正确的2的补码表示形式。BigInteger的toByteArray方法返回数字的表示形式
您得到的值实际上是您输入的数字的正确的2的补码表示形式。这是bi1的十六进制内部表示形式,您可以在调试器中看到它
mag[0] = 3FFFFFFF
mag[1] = FFFFFFFF
mag[2] = FFFFFFFF
mag[3] = FFFFFFFF
mag[4] = 00000001
如果将每个DWORD拆分为4个字节,并取每个字节的补数,
你得到你的数字
例如,对于第一行:mag[0]=3F,FF,FF,FF在十进制表示法中变成63,-1,-1
所以你的输出没有问题 这是bi1的十六进制内部表示,您可以在调试器中看到它
mag[0] = 3FFFFFFF
mag[1] = FFFFFFFF
mag[2] = FFFFFFFF
mag[3] = FFFFFFFF
mag[4] = 00000001
如果将每个DWORD拆分为4个字节,并取每个字节的补数,
你得到你的数字
例如,对于第一行:mag[0]=3F,FF,FF,FF在十进制表示法中变成63,-1,-1
所以你的输出没有问题 你说奇怪的价值是什么意思。你能详细说明一下吗?也许可以展示一些代码。干杯你的意思是它在数组中给出负数吗?如果是这样的话,这是因为Java中的字节是有符号的字节。我不明白为什么bytesBi1有这个值。嗯,在十六进制中,这个值应该是0x3FFFFFFFFFFFFFFFE,再多一些fffe。这里到底有什么奇怪的地方?这就像x^2-2形式的数字,对于正x,看起来像。@RemiWilde,我很好奇。你得到bi1的字符串数据了吗?哪个程序生成了这个字符串?你是怎么使用那个特殊的数字序列的?你说奇怪的值是什么意思。你能详细说明一下吗?也许可以展示一些代码。干杯你的意思是它在数组中给出负数吗?如果是这样的话,这是因为Java中的字节是有符号的字节。我不明白为什么bytesBi1有这个值。嗯,在十六进制中,这个值应该是0x3FFFFFFFFFFFFFFFE,再多一些fffe。这里到底有什么奇怪的地方?这就像x^2-2形式的数字,对于正x,看起来像。@RemiWilde,我很好奇。你得到bi1的字符串数据了吗?哪个程序生成了这个字符串?你是怎么碰巧使用了那个特殊的数字序列的?