Computer System Cp2.2 C에서 자르기 및 확장하기

당신에게 묻는 질문이 있다면, 이 이진수는 C에서 무엇을 의미합니까? (32비트 머신을 기준으로 하며, 다른 머신을 사용하고 있다는 특별한 언급을 제외하고는 기본적으로 32비트 머신을 사용하고 있다고 재평가합니다.)
  • 1011?
  • 0100 0001?

  • 사실, 이 32비트 시스템에 데이터를 포함하기 위해 어떤 데이터 유형을 사용하고 있는지 말하지 않았기 때문에 결정하기 어렵습니다.

    즉, 이진수 1011이 실제로 무엇인지는 할당하려는 데이터 유형을 기반으로 합니다.
    예를 들어 다른 데이터 유형에서:
  • 부호 없는 정수: 11
  • 부호 있는 정수: -5
    (signed와 unsigned 범위의 차이는 에 설명되어 있음)

  • 그리고 0100 0001이 있습니다.
  • 부호 없는 정수: 65
  • 문자: 'A'

  • 즉, C 프로그램에서 선언한 데이터 유형은 이 32비트 시스템이 "읽는"방법에 따라 결정됩니다.
  • 신고하면 unsigned int a = 65;a는 정수로 인쇄됩니다65.
  • 신고하면 int *p = 65;p는 실제로 int 변수를 포함하는 메모리 위치를 가리키는 주소 번호 65입니다.
  • 신고하면 unsigned int c = 'A';c는 실제로 65입니다. char 유형 변수가 int 유형에 할당될 때 시스템이 이 메모리를 정수로 "읽기"때문입니다. 여기서 A의 ASCII 코드는 65입니다.

  • 그러나 어떻게 작동합니까?



    내 말은, 우리는 이미 2.1장에서 char 값을 저장하기 위해 1바이트(즉, 8비트)를 사용하고, unsigned int 값을 저장하기 위해 4바이트(즉, 32비트)를 사용한다는 것을 알고 있습니다.

    이제 C에서 서로 다른 데이터 유형 간의 값 캐스팅 및 비트 자르기(확장)에 대한 질문을 생각해 보겠습니다.

    캐스팅에는 분명히 업캐스팅과 다운캐스팅이 있는 두 가지 유형이 있습니다. 그러나 Casting 문제가 있는 경우 Extending 및 Truncating도 있습니다.
  • 업캐스팅: 하위 바이트가 상위 바이트로 캐스트됩니다.
  • 다운캐스팅: 상위 바이트가 하위 바이트로 캐스트됩니다.
  • 동일한 바이트 간에 캐스팅 값도 있습니다.
    부호 있는 정수 => 부호 없는 정수
    또는
    부호 없는 정수 => 부호 있는 정수

  • 확장:



    낮은 바이트에서 높은 바이트로 발생합니다. 하위 바이트 변수가 상위 바이트 변수로 캐스트되면 상위 바이트 변수의 새로운 상위 비트는 다음과 같이 확장됩니다.
  • 0: 원래 값이 양수인 경우
  • 1: 원래 값이 네거티브인 경우

  • 예 1:

    // In memory, c is 0100 0001, which is 1 byte (8 bits).
    unsigned char c = 65;
    
    unsigned int a = c; // Upcasting and extanding
    
    //Now in memory, due to c is originally positive 
    //number, variable a will be extanding by 0 on new high bit, 
    //that is, adding 0s on the left(significant 
    //position) till filling all 4 bytes (32 bits)
    //a in memory:
    //0000 0000 0000 0000 0000 0000 0100 0001
    
    printf("%d", a);
    //65
    


    예 2:

    signed char c = -1;
    signed int a = c;
    printf("%d", a);
    //-1
    //Explaination:
    //c in memory stored as:
    //1111 1111
    //(The way to figure out how to get the nagetive value from decimal, 
    //please read the last chapter, section about 2's complement)
    //Then, upcasting the 1111 1111, adding 1 (because original value 
    //is nagetive value) on high bit position, so we have this in 4 bytes:
    //1111 1111 1111 1111 1111 1111 1111 1111
    


    계산기로 답하기:

    자르기:



    높은 비트 변수가 낮은 비트 변수로 변환되는 경우는 어떻습니까? 분명히 낮은 비트 변수는 그렇게 많은 비트를 포함할 수 없습니다. 따라서 상위 비트 위치에서 잘림을 수행해야 합니다.

    예 3:

    unsigned int a = 129;
    //which is 0000 0000 0000 0000 0000 0000 1000 0001
    //stored in memory, in 32-bit machine
    //now I want to downcast it to signed char
    signed char c = a;
    printf("%d", c);
    //what is the answer?
    //It's -127
    


    설명:
    항상 한 문장을 기억하십시오.
    데이터 유형은 컴퓨터가 읽는 방식을 결정합니다!
    이 값이 메모리에 어떻게 저장되든 컴퓨터가 사용할 실제 값은 이 값을 읽는 방법에 따라 다릅니다.

    129가 다음과 같이 부호 없는 정수로 저장되더라도:
    0000 0000 0000 0000 0000 0000 1000 0001
    그러나 결국 컴퓨터는 이 값을 signed char의 데이터로 읽습니다.
    0000 0000 0000 0000 0000 0000 1000 0001
    그리고 부호 있는 문자의 1000 0001은 -127입니다.


    *signed *와 *unsigned * 간 캐스팅:



    다음 규칙을 따르면 거의 길을 잃을 수 없습니다.
  • 컴퓨터가 읽는 방법에 관한 것입니다!
  • 부호 있는 값의 가장 중요한 위치는 그것이 양수(0)인지 또는 nagetive(1)인지 설명하는 것임을 기억하십시오.



  • 게다가 |, &, <<, >>, <<<와 같은 비트 연산자는 우리 프로그램에서 거의 사용되지 않지만 익숙해야 합니다. 그러나 시스템의 더 깊은 수준에 위치한 레지스터, 메모리 할당 및 ALU와 같이 많이 사용되었습니다.

    질문이 있으시면 여기에 댓글을 달아주세요!

    좋은 웹페이지 즐겨찾기