考虑一下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
为什么结果
-727379968
为(i*i)
?理想情况下应为1000000000000。我知道Integer的范围是从–2147483648到2147483647。因此很明显1000000000000
不在给定范围内。
为什么结果变成
-727379968
? 最佳答案
Java(与当今大多数计算机体系结构一样)使用一种叫做two's complement arithmetic的东西,它使用整数的最高有效位来表示数字为负数。如果将两个大数字相乘,最终得到的数字太大,以至于该数字设置了最高位,结果以负数结尾。