Java 为什么向长值加和会导致减法?

Java 为什么向长值加和会导致减法?,java,math,timestamp,integer,long-integer,Java,Math,Timestamp,Integer,Long Integer,我遇到了一个麻烦的问题,我真的无法向自己解释它为什么会出现 基本上我想给时间戳添加时间(一个简单的long) 我的理解如下。如果我在时间戳上加上时间,我将在将来结束。如果我在时间戳上减去时间,我将以过去结束 在我的例子中,情况正好相反。如果我在时间戳上加了一些东西,它就会减少,如果我减去一些东西,它就会增加 public class MyClass { public static void main(String args[]) { static final int MONT

我遇到了一个麻烦的问题,我真的无法向自己解释它为什么会出现

基本上我想给时间戳添加时间(一个简单的long)

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

在我的例子中,情况正好相反。如果我在时间戳上加了一些东西,它就会减少,如果我减去一些东西,它就会增加

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个字符):

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

如果我将术语更改为
(以秒为单位的月*1000L*3)
,它似乎工作正常。是因为完整的术语被转换为
长的

问题在于:

(MONTH_IN_SECONDS * 1000 * 3)
这是溢出的整数乘法,结果是一个负数:

System.out.println((MONTH_IN_SECONDS * 1000 * 3));
输出
-700705592
。您必须将
MONTH\u(以秒为单位)
声明为
long
,或者更改表达式,以便键入
long

问题在于:

(MONTH_IN_SECONDS * 1000 * 3)
这是溢出的整数乘法,结果是一个负数:

System.out.println((MONTH_IN_SECONDS * 1000 * 3));
输出
-700705592
。您必须将
MONTH\u(以秒为单位)
声明为
long
,或者更改表达式,以便键入
long

术语(以秒为单位的月*1000*3)是否因其 只有一个整数,因此计算不起作用(或以 负值)

以秒计的月份?谷歌说是2630000。(虽然我看到你有2629743。)

是的,这是一个整数溢出

术语(以秒为单位的月*1000*3)是否因其 只有一个整数,因此计算不起作用(或以 负值)

以秒计的月份?谷歌说是2630000。(虽然我看到你有2629743。)


所以,是的,这是一个整数溢出。

在打印过程中,“减法”如何变成“负”还不清楚,但无论如何。你自己已经回答了你的问题。您可以通过
System.out.println(以秒为单位的月*1000*3)简化它…您似乎已经回答了您的问题。你所有的猜测都是正确的。这是由于溢出造成的,如果使用
1000L
,则完整术语确实会变成
long
。我使用Netbeans作为IDE,但没有将其标记为可能的问题。IntelliJ显示了一条信息,它可能会导致问题,因此如果我使用不同的想法,问题本可以避免。现在还不清楚“减法”在打印过程中如何变成“减法”,但无论如何。你自己已经回答了你的问题。您可以通过
System.out.println(以秒为单位的月*1000*3)简化它…您似乎已经回答了您的问题。你所有的猜测都是正确的。这是由于溢出造成的,如果使用
1000L
,则完整术语确实会变成
long
。我使用Netbeans作为IDE,但没有将其标记为可能的问题。IntelliJ显示了一条消息,表明它可能导致问题,因此如果我使用不同的IDE,该问题本可以避免