问题记录:Java中一个累加的变量值始终等于2147483647

92 阅读1分钟

问题背景

在运行如下代码时,输出的结果最后一直都是2147483647

int a = 0;
for (int i = 0; i < 9; i++) {
    a += Math.pow(26, i);
    System.out.println("a = " + a);
}

输出结果为:

image.png

疑惑点

随着a的递增,溢出Integer.MAX_VALUE是必然的,但是溢出后应当从Integer.MIN_VALUE重新累加才对;

问题解决

Math.pow()的结果是double类型,a + Math.pow的过程从类型上看是int + double 结果会被转化成double;一旦用double表示,就可以超过Integer.MAX_VALUE,而在将a + Math.pow又赋值给int类型的变量count时发生了强转,将超过MAX_VALUE的部分截取了,这才导致这个现象

更显著的实验

double x = Integer.MAX_VALUE + 2.6d;
System.out.println(x);
int n2 = (int) (1 + x);
System.out.println(n2);

结果为

image.png