Java 不同字节[]=>;相同的大整数?

Java 不同字节[]=>;相同的大整数?,java,biginteger,Java,Biginteger,有没有人能向我解释一下,当使用公共BigInteger(byte[]val)时,两个略微不同但并非微不足道的字节数组如何产生相同的BigInteger 怎么能 import java.math.BigInteger; public class BigIntegerTest { public static void main(String[] args) { BigInteger a = new BigInteger(new byte[] {-1, -1, -1,

有没有人能向我解释一下,当使用
公共BigInteger(byte[]val)
时,两个略微不同但并非微不足道的字节数组如何产生相同的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,但我不知道在哪里。我会查一下来源。。。但是,呃,我找不到


我遗漏了什么?

第一个包含与第二个相同的值,并在左侧添加了大量符号扩展。

使用时,
新的BigInteger(字节[]),它首先在字节数组中定位无符号字节,然后收集有符号字节的值以获得数值

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


收集有符号和无符号字节后,两个数字都表示相同的
BigInteger值
,因此
equals
将生成
true

酱油:谢谢!在第2862行找到了我需要的东西。这些消息来源有多官方?我似乎记得能够从Sun下载源代码,但Oracle只将我指向OpenJDK。这两个都是相同的,原因与150与0150.OK相同。现在我明白发生了什么,但我不明白为什么。
翻译一个包含两个补码二进制表示形式的字节数组是否表明只有第一个字节的第7位是符号位?为什么它会忽略以下-1而不是将它们视为数据?@DowntroddenCodeMonkey:
它基于这样一个事实:任何给定的数字都只有一个带符号的字节
。内部实现是使用事实来完成的。您的示例是
阻止该契约,从而导致意外行为,这是正确的
。其类似的溢出行为。当分配的数字大于容量时,会出现意外行为。如果将
除一个字节外的其他字节转到+ve
,则您的数字
将不匹配。
。啊哈!我不知道这个合同。我天真地认为,
public biginger(byte[]val)
可以接受任意字节[],并返回唯一的biginger。谢谢“我会给你一个绿色的记号。@downtrencodemonkey这基本上是正确的,但表达得不是很好。所有字节在Java中都是“有符号字节”
BigInteger
不会“首先在字节数组中找到有符号字节”。它跳过所有前导符号字节(0xff),然后下一个字节是值的第一个字节,如果这些符号字节存在或值的高字节为负,则它将结果视为负。在这种情况下,您是错的。它不符合你所描述的。它和我在上面的评论中描述的一样。它跳过值为0xff的前导字节。不是“负字节”,它会在第一个非0xff字节(而不是第一个非负字节)停止该操作。你似乎不明白其中的区别。否决票。