2017-01-26 10 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

なぜ日を正しく評価する式のため、long型としてキャストする必要があるのでしょうか?

+0

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

+0

なぜこのようなことが起こったのか、もっと興味があります。 2番目の式は正しいですが、私はなぜキャストを強制する必要があるのだろうかと思っています。最初のリンクによると、すべての数学は最大のデータ型で行われるので、すべての変数が長くキャストされるべきではないでしょうか?特に、最後の数値はlong型として定義されているためです。 –

+0

日付が同じオブジェクトの場合、このコードがどのように異なる結果をもたらすかはわかりません。 intをlong型にキャストすると何も変わらないはずです。どちらの場合も日付が同じインスタンスであることを確認していますか? 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()は毎回同じではありません。私はIntellijを介して表現を評価しています。 –

関連する問題