CodeGym /Blog Java /Ngẫu nhiên /Cách chuyển đổi long thành int trong Java

Cách chuyển đổi long thành int trong Java

Xuất bản trong nhóm
Trong bài viết này, chúng tôi sẽ giải thích cách chuyển đổi long thành int trong Java và viết một số mã ví dụ. Vì long là kiểu dữ liệu lớn hơn int nên ở đây chúng ta nên sử dụng kiểu truyền cho chuyển đổi đó. Như bạn có thể đã biết cả longint trong Java đều là các kiểu dữ liệu nguyên thủy. Điều đó có nghĩa là chúng không phải là đối tượng của lớp. Tất cả các Đối tượng và mảng được lưu trữ trong Heap Space trong khi các kiểu nguyên thủy như intlong được lưu trữ trong bộ nhớ Stack. Longint có phần giống nhau. Số nguyên có nghĩa là số nguyên, có thể dương, âm hoặc bằng không. cả hai dàiint là các kiểu số nguyên nên chúng tương thích với nhau theo một cách nào đó. Vấn đề là, loại dài nằm trong khoảng từ -263 đến 263 – 1 hoặc -9223372036854775808 đến 9223372036854775807. Tức là chương trình Java phân bổ 64 bit cho loại dài . Đồng thời, kiểu int chiếm 32 bit, trong đó bạn có thể đặt các số từ -231 до 231 - 1 hoặc tương tự, từ -2147483648 đến 2147483647. Điều này có nghĩa là bất kỳ số kiểu int nào cũng có thể dễ dàng khớp với một loại dài . Trong Java, khi làm việc với các kiểu nguyên thủy, việc chuyển đổi từ kiểu hẹp hơn sang kiểu rộng hơn là tự động. Theo một cách khác, nó được gọi là mở rộng.

int myInt= 18;
long myLong= 16000;
       myLong = myInt;
Ở đây chúng tôi đang gán một int cho một biến dài . Mọi thứ diễn ra suôn sẻ, trong một phạm vi lớn hơn, một phạm vi nhỏ hơn vừa khít và chúng tôi không mất gì ngoài dung lượng bộ nhớ. Nhân tiện, khi chúng ta khai báo một biến kiểu long và xác định giá trị của nó, tốt hơn là gán chữ cái l cho nó, điều này sẽ rất hữu ích khi chúng ta làm việc với các số nằm ngoài phạm vi int .

long myVeryLong = 10000000000l;

Java dài để chuyển đổi int

Bây giờ chúng ta hãy quay lại nhiệm vụ chính của bài viết này — Chuyển đổi từ Java sang int . Vấn đề là một cái gì đó lớn hơn không phải lúc nào cũng phù hợp với một cái gì đó nhỏ hơn. Vì vậy, ở đây chúng ta không thể tự động đặt “nhỏ hơn” thành “lớn hơn” trong Java. Nếu chúng ta cố gắng hành động như trong ví dụ trước nhưng ngược lại:

//example without typecasting…nice trying! 
public static void main(String[] args) {

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
Trình biên dịch Java sẽ không cho phép chúng tôi làm điều này và sẽ báo lỗi. Vì vậy, đối với thao tác này, chúng ta cần sử dụng cái được gọi là typecasting. Quá trình này được gọi là chuyển đổi loại thu hẹp. Để thu hẹp một biến, bạn cần chỉ định rõ ràng loại mà bạn muốn truyền giá trị của mình. Dưới đây là một ví dụ mà chúng ta sẽ cố gắng đặt một số dài “nhỏ” vào int (phù hợp với số đó) và hai số dài “lớn” nằm ngoài phạm vi int .

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);
   }
}
Chúng tôi đã thông báo cho trình biên dịch rằng chúng tôi muốn đặt giá trị dài vào một biến int và chúng tôi chịu trách nhiệm về hậu quả của quyết định này. Trình biên dịch, nhìn thấy dấu hiệu rõ ràng của loại hẹp hơn, sẽ thực hiện chuyển đổi. Kết quả là, chúng tôi nhận được đầu ra:
16000 -2147483648 1410065408
Chà, 16000 chắc chắn là những gì chúng ta mong đợi thấy, nhưng tại sao lại có dấu trừ trong -2147483648? Và 1410065408 này có nghĩa là gì? Thực tế là những con số như vậy đã được lưu trữ trong một biến dài , như chúng ta nhớ, chiếm 64 bit. Chúng tôi đang cố gắng đưa những con số này vào một biến int chỉ có thể lưu trữ 32 bit. Theo quy định, 32 ô này sẽ chứa các số 0 và 1 từ 32 bit đầu tiên của số dài và phần còn lại sẽ bị loại bỏ. Do đó, nếu số ban đầu không khớp với 32 bit, thì những bit không khớp đó sẽ bị loại bỏ. Đó là lý do tại sao chúng ta chỉ có số đúng 16000, vì nó chiếm ít hơn 32 bit.

Java 8 dài để chuyển đổi int

Trong Java 8, lớp Math có một phương thức mới sẽ chuyển đổi long thành int . Đây là:

Math.toIntExact(value);
Điều tốt nhất về phương pháp này là nó kiểm soát độ dài của số được chuyển đổi và nếu giá trị quá lớn để khớp với int , nó sẽ đưa ra một ngoại lệ. Hãy xem cách nó hoạt động trong ví dụ của chúng tôi:

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));
   }
}
Đầu ra là:
16000 Ngoại lệ trong luồng "chính" java.lang.ArithmeticException: tràn số nguyên tại java.base/java.lang.Math.toIntExact(Math.java:1080) tại intToLong.main(intToLong.java:13)
Do đó, chương trình đã in số duy nhất được chuyển đổi chính xác 16000 và sau đó khi cố gắng đẩy số ngoài phạm vi 2147483648l vào int , phương thức này đã tạo ra một ngoại lệ. Vì vậy , chúng tôi không gặp vấn đề về các bit bị loại bỏ, như trong trường hợp chuyển đổi Java cổ điển sang int .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION