2017-03-03 10 views
2

long値をint値にキャストしたいが、long値がintに収まらない場合は、できるだけ大きなint値にする必要がある。これを行うための簡単な方法は、内のメソッドのように、ありますlongをintに変換してオーバーフローを切り捨てる

long longVar = ...; 
int intVar = (int) (longVar < 0 ? Math.max(longVar, Integer.MIN_VALUE) : Math.min(longVar, Integer.MAX_VALUE)); 

:(負の最大を含めるように)、それは次のようになり、より一般的な方法で

long longVar = ...; 
int intVar = (int) Math.min(longVar, Integer.MAX_VALUE) 

:私のソリューションは、そのように見えますJREか何か?

+2

'int intVar =(int)Math.min(Math.max(longVar、Integer.MIN_VALUE)、Integer.MAX_VALUE));'? '<0'チェックは必要ありません。ユーティリティメソッドに入れることもできます。 – Fildor

+0

あなたは正しいです。おかげで – David

答えて

1

改善は、それが大きい場合Math.maxは、[Long.Min、Long.Max] => [Int.Min、Long.Max]行い、どのようなことの結果であろう

int intVar = (int) Math.min(Math.max(longVar, Integer.MIN_VALUE), 
          Integer.MAX_VALUE)); 

あろうInt.Maxは外側のMath.minから[Int.Min、Int.Max]にトリムされます。

私はこれをjavaで実行する準備ができている方法がわかりません。

Java 8のMath.toIntExactメソッドは、オーバーフロー時に例外をスローします。そしてこれを使ってこれを行う - よく、私はそれを例外の誤用と見なします。そしておそらく上記の構造よりも効率が悪いです。

0

あなたはグァバを使用することができた場合は、正確に何をしたいん方法がある:static int Ints.saturatedCast(long)

long longVar = ...; 
int intVar = Ints.saturatedCast(longVar); 

は、一般的な関心について、saturation arithmetic上のWikipediaの記事があります。インテルMMX命令セットは飽和演算を使用しており、インテルはJava開発者がMMXを使用できるようにSDKを提供していると思います。 GuavaがこのSDKを使用してメソッドを実装しているかどうかはわかりません(おそらくそうではありません)。

+0

私はあなたが通常のJava Devとしてasmレベルに下がりたいと思うのではないかと疑います。しかし、知ってうれしい。 – Fildor

+0

@Fildor私は同意します。しかし、多くの典型的なJavaプログラマはすでにGuavaを使用しています。この便利なユーティリティメソッドを使用すると、実装方法に関係なく、きれいで簡単になります。 –

0

また、再利用可能なコードを書くこともできます。

package it.stackoverflow; 

public class UtilInt { 

    public static int getIntMaxMinLong(long longNumber){ 

     int intNumber = 0; 

     if (longNumber < Integer.MIN_VALUE) 
      intNumber = Integer.MIN_VALUE; 

     else if (longNumber > Integer.MAX_VALUE) 
      intNumber = Integer.MAX_VALUE; 

     else 
      intNumber = (int) longNumber; 

     return intNumber; 
    } 
} 

メソッドを静的な方法で呼び出すことができます。

package it.stackoverflow; 

public class Main { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     int intNewValue = UtilInt.getIntMaxMinLong(224748223647L); 

    } 

} 
関連する問題