Java 为什么向长值加和会导致减法?
我遇到了一个麻烦的问题,我真的无法向自己解释它为什么会出现 基本上我想给时间戳添加时间(一个简单的long) 我的理解如下。如果我在时间戳上加上时间,我将在将来结束。如果我在时间戳上减去时间,我将以过去结束 在我的例子中,情况正好相反。如果我在时间戳上加了一些东西,它就会减少,如果我减去一些东西,它就会增加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
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,该问题本可以避免