为什么将总和添加到长值会导致减法?

Why does adding a sum to a long value lead to a subtraction?

我遇到了一个棘手的问题,我无法向自己解释为什么会出现这个问题。

基本上我想将时间添加到时间戳(一个简单的长)。

我的理解如下。如果我将时间添加到时间戳,我将在未来结束。如果我将时间减去我过去结束的时间戳。

在我的例子中是相反的。如果我在我的时间戳中添加一些东西,它会减少,如果我减去一些东西,它会被添加。

public class MyClass {
    public static void main(String args[]) {
      static final int MONTH_IN_SECONDS = 2629743;

      final long current = System.currentTimeMillis();
      System.out.println("Current: " + current);

      final long future = System.currentTimeMillis() + (MONTH_IN_SECONDS * 1000 * 3);
      System.out.println("Addition: " + future);

      final long past = System.currentTimeMillis() - (MONTH_IN_SECONDS * 1000 * 3);
      System.out.println("Subtraction: " + past);
    }
}

结果(比较前 5 个字符):

Current:     1582275101365
Addition:    1581574395774 // smaller than current even though it should be greater
Subtraction: 1582975806958 // great than current even though it should be smaller

为什么会这样?术语 (MONTH_IN_SECONDS * 1000 * 3) 是否溢出,因为它只是一个整数,因此计算不起作用(或以负值结束)?

如果我将术语更改为 (MONTH_IN_SECONDS * 1000L * 3),它似乎可以正常工作。是因为完整的术语被转换为 long 吗?

问题出在这里:

(MONTH_IN_SECONDS * 1000 * 3)

这是溢出的整数乘法,结果是负数:

System.out.println((MONTH_IN_SECONDS * 1000 * 3));

输出-700705592。您必须将 MONTH_IN_SECONDS 声明为 long,或者更改表达式以使结果为 long 类型。

Does the term (MONTH_IN_SECONDS * 1000 * 3) overflow because it is only an Integer and thus the calculation does not work (or ends in a negative value)?

以秒为单位的月份? Google 说 2,630,000。 (虽然我看到你有 2629743。)

    2,630,000 * 1000 * 3 = 7,890,000,000

Integer.MAX_VALUE = 2^31 = 2,147,483,648

是的,这是 整数溢出