在本文中,我们将解释如何在 Java 中将long转换为int,并编写一些代码示例。由于long是比int更大的数据类型,所以这里我们应该使用类型转换来进行这种转换。您可能已经知道 Java 中的long和int都是原始数据类型。这意味着它们不是类对象。所有对象和数组都存储在堆空间中,而基本类型(如int和long)存储在堆栈内存中。 Long和int有点相似。整数表示整数,可以是正数、负数或零。既长和int是整数类型,因此它们在某种程度上是兼容的。问题是,long类型的范围是-263到263-1,或者-9223372036854775808到9223372036854775807。也就是说,Java程序为long类型分配了64位。同时,int类型占32位,可以放-231~231-1之间的数,也可以放-2147483648到2147483647之间的数。这意味着任意数量的int类型都可以很容易地放入一个长型。在 Java 中,当使用基元时,从较窄类型到较宽类型的转换是自动的。换句话说,它被称为加宽。
int myInt= 18;
long myLong= 16000;
myLong = myInt;
这里我们将一个int分配给一个long变量。一切都进行得很顺利,在一个更大的范围内,一个较小的范围安静地适合,除了内存空间我们没有丢失任何东西。顺便说一句,当我们声明一个long类型的变量并定义它的值时,最好将字母l分配给它,这在我们处理int范围之外的数字时会派上用场。
long myVeryLong = 10000000000l;
Java long 到 int 的转换
现在让我们回到本文的主要任务——Java long到int 的转换。问题是更大的东西并不总是适合更小的东西。所以这里我们不能在 Java 中自动将“smaller”变成“bigger”。如果我们尝试像前面的示例一样操作,反之亦然:
//example without typecasting…nice trying!
public static void main(String[] args) {
int myInt= 18;
long myLong= 16000;
myInt = myLong;
}
Java 编译器不会让我们这样做并且会抛出一个错误。所以对于这个操作,我们需要用到所谓的类型转换。这个过程称为缩小类型转换。要缩小变量的范围,您需要明确指定要将值转换为的类型。这是一个示例,我们将尝试将一个“小” long 数字放入int(应该适合)和两个超出int范围的“大” long数字。
public class longToInt {
public static void main(String[] args) {
int myInt = 18;
long myLong = 16000;
long myVeryLong = 2147483648l;//l in the end means ‘long’
long myVeryLong = 10000000000l;
myInt = (int) myLong;
System.out.println(myInt);
myInt = (int) oneMoreLong;
System.out.println(myInt);
myInt = (int) myVeryLong;
System.out.println(myInt);
}
}
我们已经通知编译器我们要将long值放入一个int变量中,我们对该决定的后果负责。编译器看到一个更窄类型的明确指示,执行转换。结果,我们得到了输出:
16000 -2147483648 1410065408
好吧,16000 绝对是我们期望看到的,但为什么 -2147483648 中是负号?这个 1410065408 是什么意思?事实上,这些数字存储在一个long变量中,我们记得它占用 64 位。我们试图将这些数字放入一个只能存储 32 位的int变量中。通常,这 32 个单元格将包含长数前 32 位的 0 和1,其余的将被简单地丢弃。因此,如果原始数字不适合 32 位,那么不适合的那些位将被简单地丢弃。这就是为什么我们只有正确的数字 16000,因为它占用的空间少于 32 位。
Java 8 long 到 int 的转换
在 Java 8 中,Math类有一个新方法可以将long转换为int。这里是:
Math.toIntExact(value);
这个方法最好的地方是它控制转换后数字的长度,如果值太大而不适合 int ,它会抛出异常。让我们看看它在我们的示例中是如何工作的:
public class intToLong {
public static void main(String[] args) {
int myInt = 18;
long myLong = 16000;
long oneMoreLong = 2147483648l;
long myVeryLong = 10000000000l;
System.out.println(Math.toIntExact(myLong));
int y = Math.toIntExact(oneMoreLong);
System.out.println(oneMoreLong);
System.out.println(Math.toIntExact(myVeryLong));
}
}
输出是:
线程“main”中的 16000 异常 java.lang.ArithmeticException:整数溢出在 java.base/java.lang.Math.toIntExact(Math.java:1080) 在 intToLong.main(intToLong.java:13)
因此,程序打印了唯一正确转换的数字 16000,然后当试图将超出范围的数字 2147483648l 压入int时,该方法抛出异常。所以我们没有丢弃位的问题,就像经典的 Java long到int转换的情况一样。
GO TO FULL VERSION