【问题标题】:Why does this Java expression not cast the final value to type long?为什么这个 Java 表达式不将最终值转换为 long 类型?
【发布时间】:2017-01-26 20:27:17
【问题描述】:
//date is a java.util date
//date.getTime() = 1485462073669
int days = 3600;
long time = date.getTime() + (days * 24 * 60 * 60 * 1000L);

这将导致时间 = 344094777669。 如果我投变量天,结果会有所不同。

date.getTime() + ((long) days * 24 * 60 * 60 * 1000L)

这将导致时间 = 4639062073669

为什么要将天数转换为 long 类型才能正确计算表达式?

【问题讨论】:

  • 我更好奇为什么会发生这种情况。第二个表达式是正确的,但我想知道为什么我需要强制转换。根据第一个链接,所有数学都是使用最大的数据类型完成的,所以不应该将所有变量都转换为 long 吗?特别是因为最后一个数字被定义为长类型。
  • 如果日期是同一个对象,我看不出这段代码如何给出不同的结果。将 int 转换为 long 应该不会改变任何事情。您确定这两种情况下的日期是同一个实例吗?一个
  • 是的,日期对象没有改变。
  • 我试过你的代码,但我得到了相同的结果。

标签: java int long-integer multiplication addition


【解决方案1】:

Java 从左到右。

days *  24  *  60  *  60  *  1000L
int  * int  *  int *  int *  long
    int     *  int *  int *  long
           int     *  int *  long
                   int    *  long
                         long

您还可以执行以下操作:

1000L *  days *  24   *   60 * 60
long  *  int  *  int  *  int * int
    long      *  int  *  int * int
             long     *  int * int
                     long    * int
                           long

但是...在您的情况下,它不应该改变任何东西。我运行您的代码,两种方法都返回相同的结果。也许date.getTime() 返回了另一个值?

【讨论】:

  • 但是3600*24*60*60 不会溢出int
  • 是的,但该等式的前半部分不会看起来像 311,040,000 * 1000L 吗? 311,040,000 不会溢出 int。然后乘以 long 将适合 long。
  • 而且没有 date.getTime() 每次都是一样的。我通过 Intellij 评估表达式。
猜你喜欢
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多