将两个大整数值相乘会产生错误的结果

0 java

此方法用于获取(通过用户输入)给定数据集中的两个最大整数并计算它们的乘积。它适用于每个输入,直到我尝试了两个整数的数组10000090000返回410065408.

这是我的 Java 方法:

static int getMaxPairwiseProduct(int[] numbers) {
    int max=0,lessermax=0;
    int n = numbers.length;

    for (int j = 0; j < n; ++j) {
        //if(j==k)continue;
        if(numbers[j]>0 && numbers[j]>=max) {               
            lessermax=max;max=numbers[j];
            System.out.println(j);//k=j;
        } else if(numbers[j]>lessermax) {      
            lessermax=numbers[j];
            System.out.println(j);}
        }
    //result=;
    return max*lessermax;
}
Run Code Online (Sandbox Code Playgroud)

这是我的main方法:

public static void main(String[] args) {
    //FastScanner scanner = new FastScanner(System.in);
    Scanner scanner=new Scanner(System.in);
    int n = scanner.nextInt();
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++) {
        numbers[i] = scanner.nextInt();
    }
    scanner.close();
    System.out.println(getMaxPairwiseProduct(numbers));
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

它的容量溢出int并环绕。100000 * 900009000000000。an 的最大正值int是 2^31-1,即2147483647(略小于 的四分之一9000000000)。

如果您想要这两个数字的乘积,则需要使用long

100000L * 90000L = 9000000000L = 0x218711a00L
Run Code Online (Sandbox Code Playgroud)

对于 32 位数据类型,超出 32 位(8 个十六进制数字)的任何内容都会因溢出而被截断。所以剩下的值是:0x18711a00==410065408