考虑一下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的东西,它使用整数的最高有效位来表示数字为负数。如果将两个大数字相乘,最终得到的数字太大,以至于该数字设置了最高位,结果以负数结尾。

10-02 09:52