为什么这个 BigInteger 在输入 FFFFFFF (8 F) 时显示不正确的结果



我想用这段代码来实现十六进制到十进制。当我输入 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());
}

正如救主在评论中所说:

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,但除此之外会给出不正确的结果。

最新更新