Java 和 Python 代码给出不同的输出?

Java and Python codes give different output?

这是 Java 代码结果 897986030:

import java.util.Arrays;
import java.util.Scanner;

class Algorithm {
    public static void main(String args[]) throws Exception {
        int mod = 1000000007;
        long factor  = 900414279;
        long p1 = 883069911;
        long p2 = 32;
        long val = 560076994;
        val = (val%mod+factor*p1*p2%mod)%mod;
        System.out.println(val);
    }
}

这是等效的 Python 代码输出 480330031:

factor  = 900414279
p1 = 883069911
p2 = 32;
val = 560076994;
mod = 1000000007;
val = (val%mod+factor*p1*p2%mod)%mod;
print val

请帮忙。谢谢!

答案在于您在 java 中使用了容易溢出的原始类型。

如果您还不了解这个概念,请让我解释一下。在 java 中,C、C++ 等原始类型为其分配了一定数量的 space,并且变量不能使用超过此数量的任何 space。这意味着 long 数据类型可以存储的最大数量。这样做是出于性能原因。

上面代码中可能发生的情况是,当您将两个 long 值相乘时,结果可能会变得大于 long 数据类型可以存储的最大值。这会导致溢出,导致数据变窄。所以数学表达式的结果是乱七八糟的。

对于 Python 这不是什么大问题,因为 Python 可以存储更大范围的数字。溢出在 Python 中很少见。这就是为什么使用大数字的密码应用程序之类的东西很容易写成 Python.