考虑 Java 语言规范中的这段代码。
class Test {
public static void main(String[] args) {
int i = 1000000;
System.out.println(i * i);
long l = i;
System.out.println(l * l);
}
}
输出是
-727379968
1000000000000
为什么 (i*i)
的结果是 -727379968
?理想情况下,它应该是 1000000000000。
我知道整数的范围是从 –2147483648 到 2147483647。所以显然是 1000000000000 不在给定的范围内。
为什么结果会变成-727379968
?
最佳答案
Java(就像当今大多数计算机体系结构一样)使用一种叫做 two's complement arithmetic 的东西,它使用整数的最高有效位来表示一个数是负数。如果将两个大数字相乘,最终得到的数字太大以至于设置了最高位,结果最终为负数。
关于java - 两个整数相乘溢出导致负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215411/