Java 在BigInteger中存储和检索时出现数字问题

Java 在BigInteger中存储和检索时出现数字问题,java,biginteger,Java,Biginteger,这里的问题是,当我将大整数转换为字节数组,然后再次将同一字节数组转换为大整数时,大整数的值正在改变。但是,当我将数字“5888561920”替换为“2944280960”或“3806908688”时,没有问题,我得到的是与输出相同的数字。这里有什么问题?BigInteger或“5888561920”有问题吗 我自己编写了toInt方法: bx:5888561920 94 -4 83 0 big: 1593594624 publicstaticbiginger-toInt(字节[]b){

这里的问题是,当我将大整数转换为字节数组,然后再次将同一字节数组转换为大整数时,大整数的值正在改变。但是,当我将数字“5888561920”替换为“2944280960”或“3806908688”时,没有问题,我得到的是与输出相同的数字。这里有什么问题?BigInteger或“5888561920”有问题吗

我自己编写了toInt方法:

bx:5888561920

 94 -4 83 0

big: 1593594624
publicstaticbiginger-toInt(字节[]b){
String st=新字符串();
对于(int k=3;k>=0;k--){
对于(int i=0;i>1);
}
}
BigInteger bi=新的BigInteger(st,2);
返回bi;
}
在toInt()中,您将连接数字的32个最低有效位(k=0..3 x i=0..7)

5888561920大于32位数字。事实上,它的二进制表示(根据Windows Calc)是10101111101111000101001100000000,长度为33位。您已截断了最重要的位

2944280960和3806908688适合32位(位33及以上无论如何都是零)

所以我想你确实需要第五个字节,毕竟:)

在toInt()中,你连接的是数字的32个最低有效位(k=0..3 x I=0..7)

5888561920大于32位数字。事实上,它的二进制表示(根据Windows Calc)是10101111101111000101001100000000,长度为33位。您已截断了最重要的位

2944280960和3806908688适合32位(位33及以上无论如何都是零)


所以我想你确实需要第五个字节:)

5888561920下面的4个字节是(5888561920%2^32)==1593594624


如果要存储此数字,则需要4个以上的字节。

5888561920中较低的4个字节是(5888561920%2^32)=1593594624


如果要存储此数字,需要超过4个字节。

我认为这是整数边界或长检查大于2^32且小于2^32的数字的问题。我认为这是整数边界或长检查大于2^32且小于2^32的数字的问题
bx:5888561920

 94 -4 83 0

big: 1593594624
public static BigInteger toInt(byte[] b){

     String st=new String();
    for(int k=3;k>=0;k--){
        for(int i=0;i<8;i++)
        {
            if ((b[k] & 0x01) == 1)
            {
                st="1"+st;
            }
            else
            {
                st="0"+st;
            }
            b[k]=  (byte) (b[k] >> 1);
        }
    }

    BigInteger bi=new BigInteger(st,2);

    return bi;
}