Java 为什么它能成功地处理这样的长数据类型的内存大小?

Java 为什么它能成功地处理这样的长数据类型的内存大小?,java,memory-management,Java,Memory Management,在数学问题方面,我对java中处理非常大的整数还不熟悉 这是我对将纸张切割成1*1正方形的解决方案的回答 public static void main(String[] args) { long result = solve(841251657, 841251657); System.out.println(result); } static long solve(int n, int m) { long r = n*m - 1; return r; } 输

在数学问题方面,我对java中处理非常大的整数还不熟悉

这是我对将纸张切割成1*1正方形的解决方案的回答

public static void main(String[] args) {
    long result = solve(841251657, 841251657);
    System.out.println(result);
}

static long solve(int n, int m) {
    long r = n*m - 1;
    return r;
}
输出为
1810315984
,这与
7077045045648
的预期输出相差甚远

但是,以下两种方式:

long
的数学计算替换为
biginger

static long solve(int n, int m) {
    BigInteger r = BigInteger.valueOf(n).multiply(BigInteger.valueOf(m));
    return r.longValue() - 1;
}
或手动插入输入(不确定是否为实际原因)

两者都可以输出预期的答案


如果我能知道原因那就太好了。非常感谢。

n*m的值从
int
限制溢出,因此您可以将
n
m
中的一个强制转换为
long
,以便将乘法结果转换为
long

public class Main {
    public static void main(String[] args) {
        long result = solve(841251657, 841251657);
        System.out.println(result);
    }

    static long solve(int n, int m) {
        long r = (long)n * m - 1;
        return r;
    }
}
输出:

707704350405245648
-2147483648
-2147483647
-2147483646
您必须知道,当
int
的值溢出时,它会从其最小限制重新开始,例如

public class Main {
    public static void main(String[] args) {
        int x = Integer.MIN_VALUE;
        System.out.println(Integer.MIN_VALUE);
        System.out.println(x + 1);
        System.out.println(x + 2);
    }
}
输出:

707704350405245648
-2147483648
-2147483647
-2147483646

n*m
的值从
int
限制溢出,因此您可以将
n
m
中的一个强制转换为
long
,以便将乘法结果转换为
long

public class Main {
    public static void main(String[] args) {
        long result = solve(841251657, 841251657);
        System.out.println(result);
    }

    static long solve(int n, int m) {
        long r = (long)n * m - 1;
        return r;
    }
}
输出:

707704350405245648
-2147483648
-2147483647
-2147483646
您必须知道,当
int
的值溢出时,它会从其最小限制重新开始,例如

public class Main {
    public static void main(String[] args) {
        int x = Integer.MIN_VALUE;
        System.out.println(Integer.MIN_VALUE);
        System.out.println(x + 1);
        System.out.println(x + 2);
    }
}
输出:

707704350405245648
-2147483648
-2147483647
-2147483646

您的方法接受
int
s并将所述
int
s相乘。
int
是一个有符号的32位数字。它溢出了。将
静态长解算(int n,int m)
更改为
静态长解算(long n,long m)
。哦,我明白了。谢谢大家!您的方法接受
int
s并将所述
int
s相乘。
int
是一个有符号的32位数字。它溢出了。将
静态长解算(int n,int m)
更改为
静态长解算(long n,long m)
。哦,我明白了。谢谢大家!