为什么将总和添加到长值会导致减法?
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
是的,这是 整数溢出。
我遇到了一个棘手的问题,我无法向自己解释为什么会出现这个问题。
基本上我想将时间添加到时间戳(一个简单的长)。
我的理解如下。如果我将时间添加到时间戳,我将在未来结束。如果我将时间减去我过去结束的时间戳。
在我的例子中是相反的。如果我在我的时间戳中添加一些东西,它会减少,如果我减去一些东西,它会被添加。
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
是的,这是 整数溢出。