|
대부분이 그렇겠지만, 저도 처음에 공부할때는 참으로 헷갈렸던 부분이기도 합니다.
이진수,십진수,아스키코드,문자형간의 상호변환관계가 무척이나 제 머리를 괴롭혔었거든요.
일단 결론부터 내리자면, CPU와 메모리는 오로지 이진비트스트림만을 다룬다는 것입니다.
절대로 메모리나 CPU에 'A'라는 등의 문자나 혹은 십진수가 그 자체로 들어갈 수가 없습니다.
char a = 'A';
라는 명령은 어셈블리로 보자면,
mov eax,0x3e8; (가령 a가 메모리주소 1000번에 할당되었을 경우)
mov byte ptr [eax],0x41;
로 변환됩니다.
편의상 16진수로 표기했지만, CPU는 실제로는 0x3e8을 보는 것이 아니라 '00000000000000000000001111101000' 보게되고 0x41대신 '01000001'을 볼 뿐입니다.
이것을 <편의상> 보기좋게 16진수로 변환해서 보여줄뿐입니다.
문자건 문자열이건 정수건 실수건간에 모두 이런식입니다. 단지 저장단위만 틀려질분입니다.
문자열은 한바이트 단위로 저장이 되고, short int는 두바이트 long int는 4바이트,
double은 8바이트 단위로 저장된다는 차이뿐이죠.
다시말해 모든 정보는 이진스트림으로 변환되어 메모리에 저장됩니다.
우리가 문자라고 부르는 데이타타입도 따지고 보면 이진타입의 숫자열에 불과합니다.
단지 출력과정에서 그것을 문자로 출력할것인지, 아니면 숫자로 출력할 것인지를
선택해주는 것 뿐이죠.
int a=0x41';
printf("%c %d %x",a,a,a);
라는 명령에서 보는 것처럼 a가 가진 0x41이라는 값을 'A'로 보여줄 것인지 아니면 십진수 65로 보여줄 것인지, 아니면 16진수 41로 보여줄 것인지를 <용도에 따라서> 변환시킬 뿐입니다.
|