주요 카테고리

NetworkEmbeddedInfraOSCComfyUIDSAProjects

컴퓨터는 어떻게 숫자와 문자를 다루는가 — 2진법, 진법 변환, 코드 체계

2026. 5. 30. 19:23·Language/C
반응형

C를 다루기 전에 컴퓨터가 데이터를 어떤 모습으로 들고 있는지 먼저 정리한다. 숫자, 색, 문자가 결국 메모리 안에서 같은 형태로 저장된다는 사실은 포인터나 자료형을 이해할 때 기준점이 된다.

비트와 2진법

전구 4개와 스위치 4개로 1001(2)을 표현한 그림

컴퓨터는 전기 스위치의 켜짐과 꺼짐, 두 가지 상태만 다룬다. 스위치 1개가 1비트(bit)다. 스위치가 켜진 상태를 1, 전기가 흐르지 않는 꺼진 상태를 0으로 표기한다.

 

스위치 여러 개를 묶으면 더 많은 경우를 표현할 수 있다. 4개를 묶으면 4비트다. 예를 들어 스위치가 켜짐·꺼짐·꺼짐·켜짐이면 1001이고, 이것이 2진수다.

 

2진법

0과 1 두 개의 숫자만 사용하는 진법 체계다. 한 자리가 표현할 수 있는 값은 0 또는 1뿐이고, 자릿수가 올라갈 때마다 2의 거듭제곱을 곱한다.

진법 변환

진법은 한 자리에서 쓸 수 있는 숫자의 개수가 다른 표기 체계다. 사람이 쓰는 10진법은 한 자리에 0부터 9까지 열 가지가 들어가고, 자릿수가 올라갈 때마다 10의 거듭제곱을 곱한다. 예를 들어 253은 2×10² + 5×10¹ + 3×10⁰이다.

 

2진법도 원리는 같고 밑수만 2다. 1001은 1×2³ + 0×2² + 0×2¹ + 1×2⁰, 즉 10진수로 9다.

 

비트가 많아지면 2진수는 자리가 길어져 사람이 읽기 어렵다. 그래서 4비트를 한 덩어리로 묶어 16진수 한 자리로 표기한다. 16진수는 한 자리에 0부터 F까지 열여섯 가지를 쓴다. 10부터 15까지는 A, B, C, D, E, F로 적는다.

2진수(4비트) 16진수 10진수
0000 0 0
0001 1 1
... ... ...
1001 9 9
1010 A 10
1100 C 12
1111 F 15

4비트가 16진수 한 자리에 정확히 대응하므로, 긴 2진수도 네 자리씩 끊어 16진수로 바꾸면 짧아진다. C 코드에서는 16진수 앞에 0x를 붙여 0x41처럼 쓴다.

16진수는 어디에 쓰이나

RGB 가산혼합 다이어그램과 픽셀 이미지

16진수 표기는 저수준 정보를 다룰 때 자주 등장한다. 대표적으로 색상, 하드웨어 주소, 메모리에 저장된 값이다.

 

화면의 색은 빨강·초록·파랑 세 빛을 섞어 만든다(RGB). 각 색의 세기를 0부터 255까지로 나타내는데, 255는 8비트로 표현되는 가장 큰 값이고 16진수로는 FF다. 세 값을 이어 붙이면 #B71C1C처럼 여섯 자리 16진수 색상 코드가 된다.

Visual Studio 메모리 창의 16진수 덤프 화면

메모리에 저장된 값을 들여다볼 때도 16진수를 쓴다. 디버거의 메모리 창은 각 바이트를 16진수 두 자리로 나열한다. 사람이 한눈에 자릿수를 가늠하기에 2진수보다 16진수가 짧고 명확하기 때문이다.

단위 체계

비트 8개를 묶은 것이 1바이트(byte)다. 1바이트는 영문자 한 글자를 저장할 수 있는 크기이며, 컴퓨터가 메모리를 관리하는 최소 단위다.

 

비트 수가 늘어날수록 표현할 수 있는 경우의 수는 2의 거듭제곱으로 커진다.

비트 수 경우의 수
4비트 16
8비트 256
16비트 65,536
32비트 4,294,967,296 (약 42.9억)

2의 10제곱은 1,024이고, 이 값이 KB·MB·GB로 올라가는 단위의 기준이 된다. 32비트는 2³²가지, 즉 약 42.9억 개의 주소를 가리킬 수 있다. 한 주소마다 1바이트를 둔다고 보면 32비트 구조가 직접 관리할 수 있는 메모리 한계는 약 4GB다.

32비트와 4GB

32비트 시스템에서 흔히 말하는 "메모리 4GB 한계"는 2³²개의 주소가 각각 1바이트를 가리키기 때문에 나오는 값이다. 주소 공간의 크기가 곧 다룰 수 있는 메모리의 크기를 정한다.

컴퓨터가 글자를 다루는 법

컴퓨터에는 숫자만 있다. 글자도 숫자에 번호를 매겨 저장한다. 이 번호 체계 중 가장 기본이 ASCII(American Standard Code for Information Interchange)다. 미국에서 만든 표준 문자 코드 체계로, 영문자·숫자·기호에 번호를 붙여 둔다.

 

예를 들어 대문자 A는 10진수 65, 16진수로는 0x41이다. 컴퓨터는 메모리에서 0x41이라는 값을 보고, 그 자리가 글자로 해석되는 맥락이면 A로 다룬다. 같은 값이 진법만 바꿔 가며 동시에 존재하는 셈이다.

핵심

숫자와 글자를 구별하지 않고 메모리 안의 값 자체를 가리킬 때는 바이너리(binary)라고 한다. 같은 바이트라도 그것을 숫자로 볼지 글자로 볼지는 해석 규칙이 정한다.

 

메모장의 "Hello World!" 텍스트와 HxD 16진수 바이트 덤프 비교

문자열도 결국 글자 코드를 바이트 단위로 나열한 것이다. 메모장에 Hello World!를 적고 그 파일을 바이트 단위로 열어 보면, H는 48, e는 65처럼 각 글자가 ASCII 번호로 한 바이트씩 저장되어 있다.

 

C에서 글자 하나는 char 타입으로 다루고, 글자 여러 개를 이어 붙인 문자열은 char 배열에 담는다. 배열에 값을 명시하지 않은 칸은 0으로 채워진다.

#include <stdio.h>

int main(void)
{
    char ch1 = 'A', ch2 = 'B', ch3 = 'C';
    char szData[4] = { 'A', 'B', 'C' };
    char szNewData[4] = { "ABC" };
    printf("%s\n", szData);
    printf("%s\n", szNewData);
    // 배열에 명시된 값이 없으면 0으로 초기화
    printf("%d\n", szData[3]);
    return 0;
}

영문 한 글자는 1바이트면 충분하지만, 한글처럼 글자 수가 많은 문자는 1바이트로 모자란다. 이런 글자를 표현하려고 나온 것이 유니코드(Unicode)다. C의 문자열은 1바이트 기반의 MBCS(Multi-Byte Character Set)와 한 글자를 2바이트로 다루는 유니코드 문자열로 나뉜다.

완료

숫자든 색이든 글자든, 메모리 안에서는 모두 같은 2진수 바이트일 뿐이다. 그 바이트를 정수로 볼지, 색으로 볼지, 글자로 볼지를 정하는 것은 자료형과 코드 체계 같은 해석 규칙이다. C를 배우는 동안 이 구분이 계속 따라온다.

반응형

'Language > C' 카테고리의 다른 글

C언어 제어문  (0) 2026.05.31
C언어 연산자  (0) 2026.05.31
C 기초 문법과 표준 입출력  (0) 2026.05.31
Visual Studio로 C 개발 환경 만들기  (0) 2026.05.31
CPU 수준 자료형과 컴파일 — 자료형, 정수·실수 표현, 컴파일러와 인터프리터  (0) 2026.05.30
'Language/C' 카테고리의 다른 글
  • C언어 연산자
  • C 기초 문법과 표준 입출력
  • Visual Studio로 C 개발 환경 만들기
  • CPU 수준 자료형과 컴파일 — 자료형, 정수·실수 표현, 컴파일러와 인터프리터
onebrotravel
onebrotravel
  • onebrotravel
    매일을 여행처럼
    onebrotravel
  • 링크

  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • Embedded
      • Language
        • C
      • OS
      • Network
      • DSA N
      • DevTools
      • Infra
      • Linux
      • Projects
      • Interests
        • ComfyUI
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 공지사항

  • 인기 글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.6
onebrotravel
컴퓨터는 어떻게 숫자와 문자를 다루는가 — 2진법, 진법 변환, 코드 체계
상단으로

티스토리툴바