1 분 소요

❄️ David Malan 교수의 모두를 위한 컴퓨터 과학(CS50 2019)을 바탕으로 정리한 내용입니다.


16진수

컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수로 표현하는 경우가 많습니다.
컴퓨터에서 데이터를 처리하기 위해 16진수를 사용할 때 장점이 있기 때문입니다.
16진수를 사용하면 10진수보다 2진수를 간단하게 나타낼 수 있습니다.

10진수를 16진수로 바꾸어보기

JPG 이미지 파일은 항상 266 216 255로 시작되고 이것은 10진수입니다.
하지만 실제 컴퓨터 내에서는 10진수를 사용하지 않습니다. 컴퓨터는 0과 1만을 이해할 수 있기 때문입니다.
스크린샷 2023-06-16 오전 2 13 00

먼저 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진수의 유용성

스크린샷 2023-06-16 오전 2 17 22

ASCII 코드에 의해 A B C는 10진수로 65 66 67에 해당합니다.
컴퓨터는 10진수를 이해할 수 없으므로 2진수로 표현해보면 01000001 01000010 01000011이 됩니다.
컴퓨터가 처리할 수 있어야 하기 때문에 어쩔 수 없지만 그 길이가 너무 긴 것을 알 수 있습니다.

하지만 16진수로 표현하면 2진수로 표현했을 때 보다 훨씬 간단해집니다.
또한 컴퓨터는 8개의 비트가 모인 바이트 단위로 정보를 표현합니다.
2개의 16진수는 1byte의 2진수로 변환되기 때문에 정보를 표현하기 매우 유용합니다.

메모리 주소

정수형 변수 n50이라는 값을 저장하고 출력한다고 생각해 봅시다.
n이라는 값은 int타입이므로, 아래 그림과 같이 우리 컴퓨터에 메모리 어딘가에 4바이트 만큼의 자리를 차지하며 저장되어 있을 것입니다.

스크린샷 2023-06-16 오전 2 18 34

C에서는 변수의 메모리상 주소를 받기 위해 &이라는 연산자를 사용할 수 있습니다.
반대로 *를 사용하면 그 메모리 주소에 있는 실제 값을 얻을 수 있습니다.

&는 주소를 가져오고, *는 그 주소로 갑니다.
#include <stdio.h>

int main(void)
{
  int n = 50;
  printf("%p\n", *&n) // 0x7ffe00b3adbc -> 16진법으로 표현된 변수 n의 메모리 주소
  printf("%i\n", *&n) // 50 -> 변수 n의 값
}


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기

태그:

카테고리:

업데이트: