C를 다루기 전에 컴퓨터가 데이터를 어떤 모습으로 들고 있는지 먼저 정리한다. 숫자, 색, 문자가 결국 메모리 안에서 같은 형태로 저장된다는 사실은 포인터나 자료형을 이해할 때 기준점이 된다.
비트와 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진수는 어디에 쓰이나

16진수 표기는 저수준 정보를 다룰 때 자주 등장한다. 대표적으로 색상, 하드웨어 주소, 메모리에 저장된 값이다.
화면의 색은 빨강·초록·파랑 세 빛을 섞어 만든다(RGB). 각 색의 세기를 0부터 255까지로 나타내는데, 255는 8비트로 표현되는 가장 큰 값이고 16진수로는 FF다. 세 값을 이어 붙이면 #B71C1C처럼 여섯 자리 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!를 적고 그 파일을 바이트 단위로 열어 보면, 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 |
