Computer System Cp2.2 C에서 자르기 및 확장하기
4198 단어 cppsystemcomputersciencec
사실, 이 32비트 시스템에 데이터를 포함하기 위해 어떤 데이터 유형을 사용하고 있는지 말하지 않았기 때문에 결정하기 어렵습니다.
즉, 이진수 1011이 실제로 무엇인지는 할당하려는 데이터 유형을 기반으로 합니다.
예를 들어 다른 데이터 유형에서:
(signed와 unsigned 범위의 차이는 에 설명되어 있음)
그리고 0100 0001이 있습니다.
'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도 있습니다.
부호 있는 정수 => 부호 없는 정수
또는
부호 없는 정수 => 부호 있는 정수
확장:
낮은 바이트에서 높은 바이트로 발생합니다. 하위 바이트 변수가 상위 바이트 변수로 캐스트되면 상위 바이트 변수의 새로운 상위 비트는 다음과 같이 확장됩니다.
예 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 * 간 캐스팅:
다음 규칙을 따르면 거의 길을 잃을 수 없습니다.
게다가 |, &, <<, >>, <<<와 같은 비트 연산자는 우리 프로그램에서 거의 사용되지 않지만 익숙해야 합니다. 그러나 시스템의 더 깊은 수준에 위치한 레지스터, 메모리 할당 및 ALU와 같이 많이 사용되었습니다.
질문이 있으시면 여기에 댓글을 달아주세요!
Reference
이 문제에 관하여(Computer System Cp2.2 C에서 자르기 및 확장하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/divide_r_conquer/csp-cp22-truncating-and-expanding-in-c-3ooe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)