[CS50] 메모리: 메모리 주소
❄️ David Malan 교수의 모두를 위한 컴퓨터 과학(CS50 2019)을 바탕으로 정리한 내용입니다.
16진수
컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수로 표현하는 경우가 많습니다.
컴퓨터에서 데이터를 처리하기 위해 16진수를 사용할 때 장점이 있기 때문입니다.
16진수를 사용하면 10진수보다 2진수를 간단하게 나타낼 수 있습니다.
10진수를 16진수로 바꾸어보기
JPG
이미지 파일은 항상 266 216 255
로 시작되고 이것은 10진수입니다.
하지만 실제 컴퓨터 내에서는 10진수를 사용하지 않습니다. 컴퓨터는 0과 1만을 이해할 수 있기 때문입니다.
먼저 255 216 255
를 2진수로 나타내보면 11111111 11011000 11111111
이 됩니다.
2진수로 모든 데이터를 표현하기에는 너무 길어지기 때문에 16진수로 바꾸어 보겠습니다.
2^4이 16이기 때문에 4bits 씩 두 덩이러 나누어 보면 0000
부터 1111
까지는 16진수로 표현할 수 있다는 것을 알 수 있습니다.
11111111
-> 1111
1111
-> f
f
-> 0xff
11011000
-> 1101
1000
-> d
8
-> 0xd8
11111111
-> 1111
1111
-> f
f
-> 0xff
16진수의 유용성
ASCII 코드에 의해 A B C
는 10진수로 65 66 67
에 해당합니다.
컴퓨터는 10진수를 이해할 수 없으므로 2진수로 표현해보면 01000001 01000010 01000011
이 됩니다.
컴퓨터가 처리할 수 있어야 하기 때문에 어쩔 수 없지만 그 길이가 너무 긴 것을 알 수 있습니다.
하지만 16진수로 표현하면 2진수로 표현했을 때 보다 훨씬 간단해집니다.
또한 컴퓨터는 8개의 비트가 모인 바이트 단위로 정보를 표현합니다.
2개의 16진수는 1byte의 2진수로 변환되기 때문에 정보를 표현하기 매우 유용합니다.
메모리 주소
정수형 변수 n
에 50
이라는 값을 저장하고 출력한다고 생각해 봅시다.
이 n
이라는 값은 int타입이므로, 아래 그림과 같이 우리 컴퓨터에 메모리 어딘가에 4바이트 만큼의 자리를 차지하며 저장되어 있을 것입니다.
C에서는 변수의 메모리상 주소를 받기 위해 &
이라는 연산자를 사용할 수 있습니다.
반대로 *
를 사용하면 그 메모리 주소에 있는 실제 값을 얻을 수 있습니다.
&는 주소를 가져오고, *는 그 주소로 갑니다.
#include <stdio.h>
int main(void)
{
int n = 50;
printf("%p\n", *&n) // 0x7ffe00b3adbc -> 16진법으로 표현된 변수 n의 메모리 주소
printf("%i\n", *&n) // 50 -> 변수 n의 값
}
💛 개인 공부 기록용 블로그입니다. 👻