2017-01-26 40 views
1
//date is a java.util date 
//date.getTime() = 1485462073669 
int days = 3600; 
long time = date.getTime() + (days * 24 * 60 * 60 * 1000L); 

Это приведет к времени = 344094777669. Если я наброшу переменные дни, результат будет другим.Почему это выражение Java не отличает окончательное значение типа long?

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

Это приведет к времени = 4639062073669

Почему нужно дней, чтобы быть отлиты как тип длинного для выражения правильно оценить?

+0

http://stackoverflow.com/questions/1494862/multiplying-long-values ​​ –

+0

Мне больше любопытно, почему это происходит. Второе выражение верно, но мне интересно, почему мне нужно заставить литье. Согласно первой ссылке, вся математика выполняется с наибольшим типом данных, поэтому не следует ли переводить все переменные до конца? Тем более, что последнее число определяется как длинный. –

+0

Я не вижу, как этот код может давать разные результаты, если дата является одним и тем же объектом. Кастинг int до долгого не должен ничего менять. Вы уверены, что дата совпадает с тем же экземпляром в обоих случаях? A – davidxxx

ответ

2

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() вернул другое значение?

+0

Но '3600 * 24 * 60 * 60' не переполняет' int'. – Kayaman

+1

Правда, но не первая половина этого уравнения выглядит как 311,040,000 * 1000L? 311 040 000 не переполняет int. Затем умноженное на длинное вписывалось бы в длинный. –

+0

И нет date.getTime() одинаково каждый раз. Im оценивает выражение через Intellij. –