CodeGym/Java Blog/무작위의/Java에서 long을 int로 변환하는 방법
John Squirrels
레벨 41
San Francisco

Java에서 long을 int로 변환하는 방법

무작위의 그룹에 게시되었습니다
회원
이 기사에서는 Java에서 long을 int 로 변환하는 방법을 설명 하고 몇 가지 코드 예제를 작성합니다. long 은 int 보다 더 큰 데이터 유형이므로 여기서는 이러한 변환을 위해 유형 캐스팅을 사용해야 합니다. Java에서 longint는 모두 기본 데이터 유형임을 이미 알고 있을 것입니다 . 즉, 클래스 개체가 아닙니다. 모든 객체와 배열은 힙 공간에 저장되는 반면 intlong 과 같은 기본 유형은 스택 메모리에 저장됩니다. longint는 다소 비슷합니다. 정수는 양수, 음수 또는 0이 될 수 있는 정수를 의미합니다. 둘 다 길다int 는 정수 유형이므로 어느 정도 호환됩니다. 문제는 long type의 범위가 -263에서 263 – 1 또는 -9223372036854775808에서 9223372036854775807이라는 것입니다. 즉, Java 프로그램은 long 유형에 대해 64비트를 할당합니다. 동시에 int 유형은 32비트를 차지하며 여기에는 -231 до 231 - 1 또는 -2147483648에서 2147483647까지의 숫자를 입력할 수 있습니다 . 유형. Java에서 프리미티브로 작업할 때 더 좁은 유형에서 더 넓은 유형으로의 변환은 자동입니다. 다른 말로 확장이라고 합니다.
int myInt= 18;
long myLong= 16000;
       myLong = myInt;
여기서는 긴 변수 에 int를 할당합니다 . 모든 것이 순조롭게 진행되었고 더 큰 범위에서는 더 작은 범위가 조용히 맞고 메모리 공간 외에는 아무것도 잃지 않습니다. 그건 그렇고, long 유형의 변수를 선언하고 그 값을 정의할 때 문자 l을 할당하는 것이 좋습니다 . 이것은 int 범위 밖의 숫자로 작업할 때 유용합니다 .
long myVeryLong = 10000000000l;

Java long에서 int로의 변환

이제 이 기사의 주요 작업인 Java long 에서 int 로의 변환으로 돌아가 보겠습니다 . 문제는 더 큰 것이 항상 더 작은 것에 맞지 않는다는 것입니다. 따라서 여기서 우리는 Java에서 자동으로 "더 작게"를 "더 크게"로 바꿀 수 없습니다. 이전 예에서와 같이 행동하려고 시도하지만 그 반대의 경우도 마찬가지입니다.
//example without typecasting…nice trying!
public static void main(String[] args) {

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
Java 컴파일러는 이를 허용하지 않으며 오류를 발생시킵니다. 따라서 이 작업을 위해 typecasting이라는 것을 사용해야 합니다. 이 프로세스를 축소 유형 변환이라고 합니다. 변수의 범위를 좁히려면 값을 캐스팅하려는 유형을 명시적으로 지정해야 합니다. 다음은 int 에 하나의 "작은" long (적합해야 함)과 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은 무엇을 의미합니까? 사실 이러한 숫자는 우리가 기억하는 것처럼 64비트를 사용하는 변수에 저장되었습니다. 우리는 이 숫자를 32비트만 저장할 수 있는 int 변수 에 넣으려고 합니다 . 일반적으로 이 32개의 셀은 긴 숫자 의 처음 32비트에서 0과 1을 포함 하고 나머지는 단순히 폐기됩니다. 따라서 원래 숫자가 32비트에 맞지 않으면 맞지 않는 비트는 그냥 버립니다. 이것이 32비트 미만을 차지하기 때문에 올바른 숫자 16000만 있는 이유입니다.

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));
   }
}
출력은 다음과 같습니다.
16000 스레드 "main"의 예외 java.lang.ArithmeticException: intToLong.main(intToLong.java:13)의 java.base/java.lang.Math.toIntExact(Math.java:1080)의 정수 오버플로
따라서 프로그램은 유일하게 올바르게 변환된 숫자 16000을 인쇄한 다음 범위를 벗어난 숫자 2147483648l을 int 로 푸시하려고 할 때 메서드에서 예외가 발생했습니다. 따라서 고전적인 Java long 에서 int 로의 변환 의 경우처럼 폐기된 비트 문제가 없습니다 .
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다