CodeGym/Java Blog/무작위의/기본 유형의 확대 및 축소
John Squirrels
레벨 41
San Francisco

기본 유형의 확대 및 축소

무작위의 그룹에 게시되었습니다
회원
안녕! CodeGym을 진행하면서 프리미티브 유형을 여러 번 접했습니다. 다음은 우리가 그들에 대해 알고 있는 짧은 목록입니다.
  1. 그것들은 객체가 아니며 메모리에 저장된 값을 나타냅니다.
  2. 여러 종류가 있습니다
    • 정수: byte , short , int , long
    • 부동 소수점(소수) 숫자: floatdouble
    • 논리값: 부울
    • 기호 값(문자 및 숫자 표시용): char
  3. 각 유형에는 고유한 값 범위가 있습니다.

원시 유형 메모리 크기 값 범위
바이트 8비트 -128 ~ 127
짧은 16비트 -32768 ~ 32767
16비트 0 ~ 65536
정수 32비트 -2147483648 ~ 2147483647
64비트 -9223372036854775808 ~ 9223372036854775807
뜨다 32비트 (2의 -149승) ~ ((2 - (2의 -23승)) * 2의 127승)
더블 64비트 (-2의 63승) ~ ((2의 63승) - 1)
부울 8(배열에서 사용하는 경우), 32(배열에서 사용하지 않는 경우) 참 또는 거짓
그러나 값이 다를 뿐만 아니라 메모리에서 차지하는 공간도 다릅니다. int 1바이트 이상을 사용합니다. 그리고 롱은 숏보다 큽니다. 프리미티브가 차지하는 메모리 양은 러시아 중첩 인형과 비교할 수 있습니다. 기본 유형의 확대 및 축소 - 2 각 중첩 인형에는 내부에 사용 가능한 공간이 있습니다. 중첩 인형이 클수록 더 많은 공간이 있습니다. 큰 중첩 인형( long )은 더 작은 int를 쉽게 수용할 수 있습니다 . 쉽게 맞고 다른 작업을 수행할 필요가 없습니다. Java에서는 프리미티브로 작업할 때 이를 암시적 변환이라고 합니다. 또는 다르게 표현하면 확장이라고 합니다.

자바에서 확장

확대 변환의 간단한 예는 다음과 같습니다.
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
여기서는 int 변수 에 바이트 값을 할당합니다 . 아무 문제 없이 할당이 성공합니다. 바이트에 저장된 값은 int가 수용할 수 있는 것보다 적은 메모리를 차지합니다. 작은 중첩 인형(바이트 값)은 큰 중첩 인형( int 변수) 안에 쉽게 들어갑니다. 그 반대의 경우, 즉 범위가 큰 데이터 유형을 수용할 수 없는 변수에 큰 값을 입력하려는 경우에는 다른 문제입니다. 실제 중첩 인형을 사용하면 숫자가 맞지 않습니다. Java를 사용하면 가능하지만 뉘앙스가 있습니다. 짧은 변수 에 int를 넣어 봅시다 :
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;// Error!
   System.out.println(bigNumber);
}
오류! 컴파일러는 큰 중첩 인형( int )을 작은 인형( short ) 안에 집어넣어 비정상적인 작업을 시도하고 있음을 이해합니다. 이 경우 컴파일 오류는 컴파일러의 경고 입니다 . 확실하다면 컴파일러에게 "모든 것이 괜찮습니다. 내가 무엇을 하는지 알고 있습니다!"라고 말합니다. 이 프로세스를 명시적 형식 변환 또는 축소라고 합니다.

Java에서 좁히기

축소 변환을 수행하려면 값을 변환하려는 유형을 명시적으로 지정해야 합니다. 즉, 컴파일러의 질문에 답해야 합니다 . 우리의 경우에는 다음과 같습니다.
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
우리는 짧은 변수 에 int를 넣고 싶고 책임을 질 것임을 명시적으로 나타냅니다. 더 좁은 유형이 명시적으로 표시된 것을 확인한 컴파일러는 변환을 수행합니다. 결과는 무엇입니까? 콘솔 출력: -27008 약간 예상치 못한 결과였습니다. 정확히 왜 우리가 그것을 얻었습니까? 사실, 그것은 모두 매우 간단합니다. 원래 그 값은 10000000 이었고 32비트를 차지하는 int 변수 에 저장되었다 . 이것은 이진 표현입니다.
기본 유형의 확대 및 축소 - 3
우리는 이 값을 16비트만 저장할 수 있는 짧은 변수에 씁니다! 따라서 숫자의 처음 16비트만 이동됩니다. 나머지는 폐기됩니다. 결과적으로 short 변수는 다음 값을 받습니다.
기본 유형의 확대 및 축소 - 4
10진수 형식은 -27008과 같습니다. 그렇기 때문에 컴파일러는 특정 유형으로의 명시적 축소 변환을 표시하여 "확인"을 요청합니다. 첫째, 이것은 당신이 결과에 책임을 지고 있음을 보여줍니다. 둘째, 변환이 발생할 때 할당할 공간을 컴파일러에 알려줍니다. 결국 마지막 예에서 short가 아닌 byte 변수에 int 값을 할당하면 16 비트가 아닌 8비트만 마음대로 사용할 수 있으며 결과는 달라집니다. 소수 유형( floatdouble )에는 변환을 좁히는 자체 프로세스가 있습니다. 진영 숫자를 정수 유형으로 변환하려고 하면 소수 부분이 버려집니다.
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
콘솔 출력: 2

char가 개별 문자를 표시하는 데 사용된다는 것을 이미 알고 있습니다 .
public static void main(String[] args) {

   char c = '!';
   char z = 'z';
   char i = '8';

}
그러나이 데이터 유형에는 이해해야 할 몇 가지 중요한 기능이 있습니다. 값 범위 표를 다시 살펴보겠습니다.
원시 유형 메모리 크기 값 범위
바이트 8비트 -128 ~ 127
짧은 16비트 -32768 ~ 32767
16비트 0 ~ 65536
정수 32비트 -2147483648 ~ 2147483647
64비트 -9223372036854775808 ~ 9223372036854775807
뜨다 32비트 (2의 -149승) ~ ((2 - (2의 -23승)) * 2의 127승)
더블 64비트 (-2의 63승) ~ ((2의 63승) - 1)
부울 8(배열에서 사용하는 경우), 32(배열에서 사용하지 않는 경우) 참 또는 거짓
char 유형 에 대해 0에서 65536 범위가 표시됩니다 . 그러나 그것은 무엇을 의미합니까? 결국 문자는 숫자만 나타내는 것이 아니라 문자, 문장 부호도 나타냅니다. 자바에서는 문자 값이 유니코드 형식으로 저장됩니다. 우리는 이전 수업 중 하나에서 이미 유니코드를 접했습니다. 유니코드는 전 세계 거의 모든 언어의 기호를 포함하는 문자 인코딩 표준이라는 것을 기억하실 것입니다. 즉, 모든 언어의 거의 모든 문자를 나타내는 특수 코드 목록입니다. 전체 유니코드 테이블은 매우 크며, 물론 그것을 암기할 필요가 없습니다. 다음은 그것의 작은 부분입니다. 기본 유형의 확대 및 축소 - 5 가장 중요한 것은 문자가 저장되는 방식을 이해하고 특정 문자에 대한 코드를 알고 있으면 프로그램에서 항상 해당 문자를 생성할 수 있다는 점을 기억하는 것입니다. 임의의 숫자로 시도해 봅시다.
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
콘솔 출력: 耰 이것은 Java에서 char 를 저장하는 데 사용되는 형식입니다 . 각 기호는 숫자, 즉 16비트(2바이트) 숫자 코드에 해당합니다. 유니코드에서 32816은 한자 耰에 해당합니다. 다음 사항에 유의하십시오. 이 예에서는 int 변수를 사용했습니다. 이것은 메모리에서 32비트를 차지하는 반면 char는 16비트를 차지합니다. 여기서는 int를 선택했습니다 . 숫자(32816)가 short에 맞지 않기 때문 입니다 . char 의 크기 ( short 와 마찬가지로 )는 16비트이지만 char 범위 에는 음수가 없으므로 char 의 "양수" 부분은범위는 두 배입니다( 짧은 유형의 경우 32767 대신 65536). 코드가 65536 미만인 한 int를 사용할 수 있습니다. 그러나 65536보다 큰 int 값을 생성하면 16비트 이상을 차지하게 됩니다. 그러면 변환이 좁아집니다.
char c = (char) x;
추가 비트는 폐기되고(위에서 설명한 대로) 그 결과는 매우 예상치 못한 것입니다.

문자 및 정수 추가의 특수 기능

특이한 예를 살펴보겠습니다.
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i + c);
   }
}
콘솔 출력: 50 O_О 어떻게 이해가 됩니까? 1+1. 50은 어디에서 왔습니까?! char값이 0에서 65536 범위의 숫자로 메모리에 저장되고 이러한 숫자가 문자의 유니코드 표현이라는 것을 이미 알고 있습니다 . 문자 와 일부 정수 유형을 기본 유형의 확대 및 축소 - 6 추가하면 문자가 해당 유니코드 숫자로 변환됩니다. 코드에서 1과 '1'을 추가하면 기호 '1'이 자체 코드인 49로 변환됩니다(위 표에서 확인할 수 있음). 따라서 결과는 50입니다. 다시 한 번 우리의 오랜 친구 耰를 예로 들어 어떤 숫자에 더해 봅시다.
public static void main(String[] args) {

   char c = '耰';
   int x = 200;

   System.out.println(c + x);
}
콘솔 출력: 33016 우리는 이미 耰가 32816에 해당한다는 것을 발견했습니다. 그리고 이 숫자와 200을 더하면 결과는 33016입니다. :) 보시다시피 여기 알고리즘은 매우 간단하지만 잊지 말아야 합니다. .
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다