Answers:
在Java 8中进行了更新:
Math.toIntExact(value);
原始答案:
简单类型转换应该做到这一点:
long l = 100000;
int i = (int) l;
但是请注意,大量数字(通常大于2147483647
和小于-2147483648
)会丢失一些位,并且显示不正确。
例如,2147483648
将表示为-2147483648
。
Long x = 100L;
int y = x.intValue();
intValue()
在后台执行的所有操作。
long
在这里不是原始的。它Long
不能直接转换为原始类型的引用类型int
。int y = (int)x;
将抛出一个执行,但int y = (int)(long)x
会起作用。(原因是自动装箱)
对于较小的值,强制转换就足够了:
long l = 42;
int i = (int) l;
但是,与long
相比,a 可以容纳更多的信息int
,因此在通常情况下,不可能完美地从转换long
为int
。如果long
保留的数字小于或等于Integer.MAX_VALUE
您可以通过转换进行转换而不会丢失任何信息。
例如,以下示例代码:
System.out.println( "largest long is " + Long.MAX_VALUE );
System.out.println( "largest int is " + Integer.MAX_VALUE );
long x = (long)Integer.MAX_VALUE;
x++;
System.out.println("long x=" + x);
int y = (int) x;
System.out.println("int y=" + y);
在我的机器上产生以下输出:
largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648
注意上的负号y
。由于x
其值比Integer.MAX_VALUE大一,int y
因此无法持有它。在这种情况下,它环绕到负数。
如果您想自己处理这种情况,可以执行以下操作:
if ( x > (long)Integer.MAX_VALUE ) {
// x is too big to convert, throw an exception or something useful
}
else {
y = (int)x;
}
所有这些都假定为正数。对于负数,请使用MIN_VALUE
代替“ MAX_VALUE”
从Java 8开始,您可以使用:Math.toIntExact(long value)
返回long参数的值;如果该值溢出一个int,则引发异常。
Math.toIntExact
JDK 8中的源代码:
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
如果使用番石榴库,有方法Ints.checkedCast(long)
,并Ints.saturatedCast(long)
转换long
到int
。
long x = 3;
int y = (int) x;
但是假设long
可以将表示为int
,您知道两者之间的区别吗?
在Java中,long是带符号的64位数字,这意味着您可以存储-9,223,372,036,854,775,808和9,223,372,036,854,775,807(含)之间的数字。
另一方面,int是带符号的32位数字,这意味着您可以存储-2,147,483,648和2,147,483,647(含)之间的数字。
因此,如果您的long超出了int允许的值,则不会获得有价值的转换。
有关原始Java类型的大小的详细信息,请参见:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
在Java 8中,我按照以下方式进行操作
long l = 100L;
int i = Math.toIntExact(l);
ArithmaticException
如果long
值超出的范围,则抛出此方法int
。因此,我可以避免数据丢失。
Long l = 100;
int i = Math.round(l);