C언어로 작성한 코드가 실제로 컴퓨터 메모리에 어떻게 저장되는지 알아본다.
16진수
컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많다. 컴퓨터에서 데이터를 처리하기 위해 16진수를 사용할 때 장점이 있기 때문이다. 16진수와 일상생활에서 우리가 사용하는 10진수와 비교하면 그 차이를 알 수 있다. 16진수를 사용하면 10진수보다 2진수를 간단하게 나타낼 수 있다. 16진수로 값을 표현하는 방법을 이해하고 나면 16진수, 2진수, 10진수를 변환하는 프로그램을 만들어볼 수 있다.
10진수를 16진수로
JPG 이미지 파일은 항상 255 216 255 로 시작되고 이것은 10진수이다. 하지만 실제 컴퓨터 내에서는 10진수를 사용하지 않는다. 컴퓨터는 0과 1만을 이해할 수 있기 때문이다.
255 216 255를 2진수로 나타내보면 위 이미지와 같다. 2진수로 모든 데이터를 표현하기에는 너무 길어지기 때문에 16진수로 바꾸어 본다. 2^4이 16이기 때문에 4bits씩 두 덩어리로 나누어 보면 0000 부터 1111까지는 16진수로 표현할 수 있다는 것을 알 수 있다.
16진수에서 10부터 15까지는 어떻게 표기할까? 10은 a, 11은 b, …, 15는 f를 대입하여 사용한다 4bits씩 16진수로 변환 후 0x를 붙혀 뒤에 오는 문자들이 16진수임을 알려준다.
16진수의 유용성
ASCII 코드에 의해 “A, B, C”는 10진수로 65, 66, 67에 해당한다. 컴퓨터는 10진수를 이해할 수 없으므로 2진수로 표현해보면 "01000001 01000010 01000011"이 된다. 컴퓨터가 처리할 수 있어야 하기 때문에 어쩔 수 없지만 그 길이가 너무 길다.
하지만 16진수로 표현하면 2진수로 표현했을 때 보다 훨씬 간단해진다. 또한 컴퓨터는 8개의 비트가 모인 바이트 단위로 정보를 표현한다. 2개의 16진수는 1byte의 2진수로 변환되기 때문에 정보를 표현하기 매우 유용하다.
메모리 주소
C에서는 변수의 메모리상 주소를 받기 위해 ‘&’이라는 연산자를 사용한다.
#include <stdio.h>
int main(void)
{
int n = 50;
printf("%p\n", &n);
}
위 코드를 실행하면 '0x7ffd6ce76794'와 같은 값을 얻을 수 있다. 이는 변수 n의 16진법으로 표현된 메모리의 주소이다.
반대로 ‘*’를 사용하면 그 메모리 주소에 있는 실제 값을 얻을 수 있다.
#include <stdio.h>
int main(void)
{
int n = 50;
printf("%i\n", *&n);
}
위 코드는 먼저 n의 주소를 얻고, 또 다시 그 주소에 해당하는 값을 얻어와 출력한 것이므로 결국 ‘50’이라는 값이 출력된다.
출처
https://www.boostcourse.org/cs112/lecture/119032/?isDesc=false
'Programming > 온라인 교육' 카테고리의 다른 글
[CS50] 문자열 (0) | 2021.12.06 |
---|---|
[CS50] 포인터 (0) | 2021.12.06 |
[CS50] 알고리즘 (0) | 2021.12.03 |
[CS50] 문자열 (0) | 2021.12.02 |
[CS50] 컴파일링 (0) | 2021.12.02 |