컴퓨터는 왜 16진수로 표현하는 것을 좋아할까

hyungjunn·2024년 9월 29일

16진수는 컴퓨터에서 다양한 데이터와 정보를 표현하는 방식이다. 우리가 웹사이트를 디자인할 때 사용하는 색상 코드인 RGB 값은 #FFFFFF와 같이 16진수로 나타내며, 프로그램의 메모리 주소나 MAC 주소, 네트워크 통신에서도 중요한 역할을 한다. 그렇다면 왜 하필이면 16진수일까?

그 전에 용어들의 정의를 명확히 할 필요성이 있다.

  • 워드: 여러 비트들을 묶은 단위를 뜻한다.

  • 진수: 수를 표현하는 체계이다. 2진수는 0과 1, 8진수는 0~7, 10진수는 9까지, 16진수는 0부터 F까지(0~9, A~F)

  • 비트: 컴퓨터가 데이터를 처리하고 저장하는 가장 작은 단위. 0과 1로 이루어진 2진수를 표현하는데 사용된다.

    "1947년경 미국의 수학자인 존 와일더 튜키(John Wilder Tukey, 1915~2000)는 미래에 컴퓨터가 널리 유행되면 이진수(binary digit)라는 단어가 지금보다 훨씬 더 중요한 의미를 가지리라는 것을 알아차려버렸스빈다. 그는 binary digit라는 다섯 음절짜리 단어 대신에 좀 더 짧고 새로운 단어를 만들어서 사용하기로 하였지요. 그는 처음에 bigit나 binit와 같은 단어도 고려했지만, 결국에는 짧고 , 간단하고, 우아하고, 완벽하게 사랑스러운 단어인 bit(비트)를 사용하기로 결정하였습니다."
    출처: CODE 코드 2판 - 찰스 펫졸드

  • 바이트: 컴퓨터에서 데이터를 처리하고 표현하는 기본 단위. 8개의 비트가 모여 한 바이트가 된다. 따라서, 2^8인 256개의 값을 표현할 수 있으며, 주로 문자, 숫자, 이미지같은 실제 정보를 표현한다.

이제 과거로 돌아가서 그 때의 상황을 상상해보자. 책 CODE에 따르면, 초기엔 워드의 길이로 6비트, 12비트, 18비트, 24비트와 같이 6비트의 배수를 사용한 것들도 있다고 한다. 이 이유를 생각해본 결과, 아주 옛날에는 컴퓨터가 정말 간단한 연산만 하는 도구였기 때문에 6비트로 충분했기 때문이다. 이에 따라 자연스럽게 6의 배수인 12, 18, 24로 서서히 확장시킨 결과였다.

6비트의 문제는 점점 표현하고자 하는게 늘어남에 따라 발생한다. 초반엔 대문자 알파벳만을 표현했지만, 대문자, 소문자, 숫자, 기호 등 더 다양하게 쓰고 싶다면 어떻게 될까? (참고로, 컴퓨터의 발전은 미국을 중심으로 하기 때문에 영어를 기준으로 말할 수 밖에 없다.)

  • 대문자 알파벳: A~Z까지 26개
  • 숫자: 0~9까지 10개
  • 기본 기호: (쉼표, 마침표, 괄호 등) 10개
  • 제어 문자: (줄 바꿈, 탭 등) 18개

이 값들을 다 더해보자. 26 + 10 + 10 + 18 = 64개이다. 64는 2^6으로 6비트로 표현할 수 있는 범위에 꽉 차는 값이다. 여기에서 소문자 알파벳까지 표현하려면 6비트로는 부족하게 된다. 따라서, 6보다 큰 2의 거듭제곱인 8을 기준으로 삼게 되었다. 이것이 8비트를 한 단위로 묶은 바이트의 탄생이다.

8비트는 기본적으로 2진수이다. 하지만, '10100100은 얼마만큼의 값일까'를 생각한다면, 사람의 입장에서 직관적으로 와닿지가 않는다. 따라서, 이 2진수의 형태를 사람이 관리하기 편한 형태의 진수로 바꾸려는 노력을 하였다.

그렇다면, 인간이 이해하기 쉬운 10진수로 8비트를 표현하면 아주 편해지지 않을까? 란 궁금증이 생길 수도 있다. (인간이 왜 10진수를 이해하기 쉽냐고 의문을 가진다면, 우리 눈 앞에 놓인 손가락의 갯수를 생각해보면 된다.) 10진수로 변환하는 것은 가능하지만, 컴퓨터는 2진수를 기본으로 작동하기 때문에 비효율적이다.

역사적으로 보면, 16진수가 있기 이전에 8진수로 8비트를 표현하려고 했다. 왜냐? 앞에서 얘기한바와 같이 8비트가 있기 이전에 6비트가 유행했기 때문이다. 6비트는 6개의 비트로 이루어져 있다. 이것을 3비트씩 두 그룹으로 나누어 보면, 8진수로 쉽게 변환할 수 있다. 예를 들어, 6비트 값 101001을 3비트씩 나누면 101과 001이 된다. (3비트는 2^3, 즉 8이므로 8가지로 표현이 가능한 8진수와 맞아 떨어지기 때문에 3비트씩 나누는 것.)

  • 101 = 5(8진수)

  • 001 = 1(8진수)
    6비트 101001은 5진수 51로 표현이 가능하다. 이렇게 딱딱 나누어 떨어지기 때문에 비트를 8진수로 나누어 표현할려고 했다. 이제 8비트를 8진수로 나누어보자. 8비트 값 10111111을 3비트씩 나누려고 하면, 다음과 같이 나누어질 수 있다.

  • 10

  • 111

  • 111

이렇게 8비트를 3개씩 나누려고 하면, 딱 나눠떨어지지 않기 때문에 호환성이 떨어지게 된다. 따라서, 2^3보다 한번 더 2제곱을 한 2^4인 16으로 표현할려고 하는 시도가 있었고, 이것이 오늘날의 컴퓨터가 16진수로 데이터를 표현하게 된 이유이다. 앞의 8비트값 10111111을 4비트씩(16진수의 16은 2^4이기 때문) 나누어 보자.

  • 1011 = B(1011은 십진수로 11인데 16진수로 나타낼 때, 한자리수로 나타내져야 하기 때문에 9 이후부터는 A~F로 나타냄.)
  • 1111 = F(16진수)

이렇게 BF로 나타낼 수 있다.

그렇다면 이 16진수가 어디에서 사용이 될까? 아래와 같이 컴퓨터에서의 많은 곳에서 사용하고 있다.

  • 메모리 주소 지정: 컴퓨터의 메모리 주소는 일반적으로 16진수로 표현된다. 이는 프로그래머들이 메모리 위치를 더 쉽게 이해하고 조작할 수 있게 해준다.
  • 네트워킹: MAC 주소나 IPv6 주소와 같은 네트워크 식별자는 16진수로 표현된다. 이는 긴 비트 시퀀스를 더 간결하고 읽기 쉬운 형태로 만들어준다.
  • 색상 코드: css에서 RGB 색상 값은 #FFFFFF와 같은 16진수 형태로 표현된다. 이는 0-255 범위의 RGB 값을 단 두 자리로 나타낼 수 있게 해준다.
  • 디버깅과 분석: 메모리 덤프나 바이너리 파일 분석 시 16진수가 사용된다. 이는 raw 바이너리 데이터를 사람이 읽을 수 있는 형태로 표현해준다.
  • 문자 인코딩: ASCII와 같은 문자 인코딩 표준에서도 16진수가 사용되며, 이는 문자와 숫자 간의 매핑을 더 쉽게 이해할 수 있게 해준다.

이처럼 16진수는 단순히 나타나는 것이 아니라, 컴퓨터 시스템의 다양한 층위에서 중요한 역할을 수행한다. 복잡한 디지털 정보를 인간이 이해하고 조작하기 쉬운 형태로 변환해준다. 따라서 16진수에 대한 이해는 현대 컴퓨팅 환경에서 필수적이다.

0개의 댓글