如何在Java中将long转换为int?

Art*_*hur 282 java

如何在Java中将long转换为int?

Frx*_*rem 331

在Java 8中更新:

Math.toIntExact(value);
Run Code Online (Sandbox Code Playgroud)

原答案:

简单类型转换应该这样做:

long l = 100000;
int i = (int) l;
Run Code Online (Sandbox Code Playgroud)

但请注意,大数(通常大于2147483647和小于-2147483648)将丢失一些位并且将被错误地表示.

例如,2147483648将表示为-2147483648.

  • 对于对象和原始类型,强制转换具有不同的含义.(int)l不会尝试将64位整数视为32位整数,它实际上返回具有相同32位低位的不同32位整数.对于对象,您可以转换为更具体的子类,但使用primitve类型时,强制转换实际上不是强制转换,而是转换. (7认同)
  • @khachik我认为精度是1.或者当然可能是42 :) (3认同)
  • Math.toIntExact() 实际上是一个很好的方法。如果值太大而无法放入 int 中,它会抛出异常。谢谢你的建议。 (2认同)

Lax*_*man 174

Long x = 100L;
int y = x.intValue();
Run Code Online (Sandbox Code Playgroud)

  • 我会说这将是最好的方式. (3认同)
  • 注意类型。这里不是原始的“long”。它的引用类型“Long”不能直接转换为原始“int”。`int y = (int)x;` 会抛出一个 execption 但 `int y = (int)(long)x` 会起作用。(原因是自动装箱) (3认同)

mnd*_*rix 56

对于小值,铸造就足够了:

long l = 42;
int i = (int) l;
Run Code Online (Sandbox Code Playgroud)

但是,a long可以包含比a 更多的信息int,因此在一般情况下不可能完美地转换longint.如果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);
Run Code Online (Sandbox Code Playgroud)

在我的机器上产生以下输出:

largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648
Run Code Online (Sandbox Code Playgroud)

注意负号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;
}
Run Code Online (Sandbox Code Playgroud)

所有这些都假定为正数.对于负数,请使用MIN_VALUE而不是"MAX_VALUE"


Kuc*_*chi 51

从Java 8开始,您可以使用:Math.toIntExact(long value)

请参阅JavaDoc:Math.toIntExact

返回long参数的值; 如果值溢出int则抛出异常.

Math.toIntExactJDK 8的源代码:

public static int toIntExact(long value) {
    if ((int)value != value) {
        throw new ArithmeticException("integer overflow");
    }
    return (int)value;
}
Run Code Online (Sandbox Code Playgroud)


And*_*ich 34

如果使用Guava库,有方法Ints.checkedCast(long)Ints.saturatedCast(long)转换longint.

  • @Grekz这取决于OP.我会在这种情况下.除非你有一个实际的理由没有更多的依赖性罐子,否则更多的依赖性罐子比更多重新发明的轮子更好. (6认同)
  • 由于我的项目已经包含了jar,因此使用它比编写新助手更有益 (5认同)
  • 不需要使用库 (4认同)

The*_*heo 23

long x = 3;
int y = (int) x;
Run Code Online (Sandbox Code Playgroud)

但是假设long可以表示为int,你知道两者之间的区别吗?

  • 有趣的是,根据http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#189955(Java语言规范)中的参考5.1.3:尽管溢出,可能会出现下溢或其他信息丢失,缩小原始类型之间的转换不会导致运行时异常(第11节). (6认同)

ele*_*nzx 16

您可以使用Long包装器而不是long原语并调用Long.intValue() http://docs.oracle.com/javase/7/docs/api/java/lang/Long.html#intValue()

它相应地舍入/截断long值以适合int.

  • 查看 Long.intValue() 的 Java 7 实现,它只是转换。没有执行下/溢出检查。所以至少通过 Java 7,这个选项相当于:(int)someLong。 (2认同)

Ste*_*iks 12

最短、最安全、最简单的解决方案是:

long myValue=...;
int asInt = Long.valueOf(myValue).intValue();
Run Code Online (Sandbox Code Playgroud)

请注意, 的行为Long.valueOf是这样的:

使用此代码:

System.out.println("Long max: " + Long.MAX_VALUE);
System.out.println("Int max: " + Integer.MAX_VALUE);        
long maxIntValue = Integer.MAX_VALUE;
System.out.println("Long maxIntValue to int: " + Long.valueOf(maxIntValue).intValue());
long maxIntValuePlusOne = Integer.MAX_VALUE + 1;
System.out.println("Long maxIntValuePlusOne to int: " + Long.valueOf(maxIntValuePlusOne).intValue());
System.out.println("Long max to int: " + Long.valueOf(Long.MAX_VALUE).intValue());
Run Code Online (Sandbox Code Playgroud)

结果为:

Long max: 9223372036854775807
Int max: 2147483647
Long max to int: -1
Long maxIntValue to int: 2147483647
Long maxIntValuePlusOne to int: -2147483648
Run Code Online (Sandbox Code Playgroud)


Moh*_*d H 5

如果直接投射显示错误,您可以这样做:

Long id = 100;
int int_id = (int) (id % 100000);
Run Code Online (Sandbox Code Playgroud)