CodeGym /Java 博客 /随机的 /如何在 Java 中将 long 转换为 int
John Squirrels
第 41 级
San Francisco

如何在 Java 中将 long 转换为 int

已在 随机的 群组中发布
在本文中,我们将解释如何在 Java 中将long转换为int,并编写一些代码示例。由于long是比int更大的数据类型,所以这里我们应该使用类型转换来进行这种转换。您可能已经知道 Java 中的longint都是原始数据类型。这意味着它们不是类对象。所有对象和数组都存储在堆空间中,而基本类型(如intlong)存储在堆栈内存中。 Longint有点相似。整数表示整数,可以是正数、负数或零。既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 longint 的转换。问题是更大的东西并不总是适合更小的东西。所以这里我们不能在 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 141006540​​8
好吧,16000 绝对是我们期望看到的,但为什么 -2147483648 中是负号?这个 141006540​​8 是什么意思?事实上,这些数字存储在一个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 longint转换的情况一样。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION