2017-03-03 21 views
2

我想将一个long值转换为一个int值,并且如果long值太大而无法放入int中,它应该只是最大的int值。我的解决方案看起来像这样:将long转换为int来切断溢出

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

在更普遍的方式(包括最大负),这将是:

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

是否有更简单的方式来做到这一点,像一个方法JRE还是什么?

+2

'intVar =(int)Math.min(Math.max(longVar,Integer.MIN_VALUE),Integer.MAX_VALUE));'?不需要'<0'检查。你也可以把它变成一个实用的方法。 – Fildor

+0

哦,你是对的。谢谢 – David

回答

1

的改进将是

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

Math.max将使[Long.Min,Long.Max] => [Int.Min,Long.Max]和任何的这种结果,如果是更大的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维基百科的文章。英特尔MMX指令集使用饱和算法,我认为英特尔提供了一个SDK以允许Java开发人员使用MMX。我不确定Guava是否实现了使用此SDK的方法(可能不是)。

+0

我怀疑你是否愿意像平常的Java Dev那样去下一个级别。但很高兴知道。 – 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); 

    } 

}