输入FFFFFFFF(8 F)时,为什么此BigInteger显示不正确的结果

问题描述 投票:1回答:1

我想使用此代码实现十六进制到十进制。当我输入FFFFFFFF(8F)时,它显示2415919102.但是,4294967295是正确的。当我输入F或F或FFF ... FFFFFFF(7F)时,它表现良好。

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String t = in.next();
    in.close();

    BigInteger bi = new BigInteger("0");
    int j = 0;
    for(int i=t.length()-1;i>=0;i--,j++) {
        char c = t.charAt(i);
        double val = Integer.valueOf(c+"",16);
        val = val*Math.pow(16, j);
        BigInteger bi2 = new BigInteger((int)val+"");
        bi = bi.add(bi2);           
    }
    System.out.println(bi.toString());
}
java hex decimal biginteger
1个回答
1
投票

正如救主在a comment所说:

    BigInteger bi = new BigInteger(t, 16);

4294967295

什么地方出了错?

你在这一行中溢出了int

        BigInteger bi2 = new BigInteger((int)val+"");

当处理8位十六进制数中的前导F时,你的double是4.02653184E9或4026531840.0,但是被转换为最大可能的int值,这只是2147483647.因此你的代码适用于适合int的字符串,最高为7FFFFFFF,但除此之外给出不正确的结果。

© www.soinside.com 2019 - 2024. All rights reserved.