Android/Java:long不会超过max_value而变为负数

use*_*310 9 java android long-integer

我正在尝试在我的Android应用程序中做一些基本的计算内容来比较一个Date.getTime()值和一些计算的东西.

我在数据库查询期间进行的计算是:

long minus = pauseDays * 24 * 60 * 60 * 1000;
Run Code Online (Sandbox Code Playgroud)

所以基本上我计算的是毫秒值pauseDays.如果pauseDays变大(我说的是90天左右),就会发生一些奇怪的事情.计算结果为负数.

奇怪的是,结果应该是7776000000,所以它应该小于Long.MAX_VALUE.有人可以向我解释为什么我在这里得到负数吗?

Eri*_*ric 22

原因可能是因为pauseDays是一种int类型,对吗?然后你将它乘以另一堆ints,然后将其转换为long.

考虑一下:

public class Main {
  public static void main(String[] args) {
    int pauseDays = 90;
    long minus = pauseDays * 24 * 60 * 60 * 1000;
    System.out.println(minus);

    long pauseDaysL = 90L;
    long minusL = pauseDaysL * 24L * 60L * 60L * 1000L;
    System.out.println(minusL);
  }
}
Run Code Online (Sandbox Code Playgroud)

这个输出是:

-813934592
7776000000
Run Code Online (Sandbox Code Playgroud)

请注意,第一个long minus使用整数来生成其值.第二个long minusL使用所有长整数值.