java - 两个整数相乘溢出导致负数

标签 java integer overflow

考虑 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/

相关文章:

java - 说明 : google has disabled uso of the Maps api for this application

java - 将字符串值转换为 int

html - 使背景颜色延伸到溢出区域

css - 文本从 div 溢出

r - 如何在运行时向用户询问一个整数,如果没有得到则再次递归询问?

c++ - 如何检测 c/c++ 程序中可能/潜在的堆栈溢出问题?

java - 如何检查特定日期时间是否位于相邻行日期之间?

java - 链接 replaceFirst() 调用对于 51 个调用链来说效率低吗?

java - 来自 JTextField 的 getText() 的问题

javascript - BugHunt - Javascript 解析错误?