레슨 1 · C언어 문법
우리는 평소에 숫자를 셀 때 0, 1, 2, 3, ..., 9까지 10개의 숫자를 사용해요. 9 다음에 셀 숫자가 없으면 앞자리를 하나 늘려서 "10"이라고 쓰지요. 이렇게 10개의 숫자(0~9)를 사용하고, 다 쓰면 자리를 올리는 방법을 **10진법(decimal)**이라고 해요.
그런데 컴퓨터 내부의 전자회로는 전기가 흐르는지(1) 안 흐르는지(0), 두 가지 상태만 구별할 수 있어요. 그래서 컴퓨터는 0과 1, 단 두 개의 숫자만 사용하는 **2진법(binary)**으로 모든 정보를 저장해요.
사실 "진법"은 10진법, 2진법만 있는 게 아니에요. N개의 숫자를 사용하고, N이 되면 자리를 올리는 규칙이면 무엇이든 N진법이 될 수 있어요. 3진법(0,1,2 사용), 4진법(0,1,2,3 사용), 5진법처럼 원하는 만큼 만들 수 있어요. 그중에서 컴퓨터와 친한 2진법, 8진법, 16진법을 자세히 알아볼게요.
0부터 1씩 늘려가며 적어보면:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, ...
9 다음에는 쓸 숫자가 없어서, 1의 자리를 0으로 되돌리고 10의 자리를 1 올려요.
사용할 수 있는 숫자는 딱 2개, 0과 1뿐이에요. 직접 1씩 늘려가며 적어볼까요?
0
1
10 <- 1 다음에 쓸 숫자가 없어서 자리올림! (1의 자리 0, 2의 자리 1)
11
100 <- 11 다음, 1의 자리도 2의 자리도 다 차서 두 번 자리올림!
101
110
111
1000
10진수와 2진수를 나란히 표로 보면:
| 10진수 | 2진수 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 2 | 10 |
| 3 | 11 |
| 4 | 100 |
| 5 | 101 |
| 6 | 110 |
| 7 | 111 |
| 8 | 1000 |
| 9 | 1001 |
| 10 | 1010 |
✏️ 직접 해보기: 11, 12, 13을 2진수로 쓰면 어떻게 될까요? 정답: 1011, 1100, 1101
사용할 수 있는 숫자는 0~7, 8개예요. 7 다음에는 자리올림!
0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, ...
7 다음에 쓸 숫자가 없어서 "10"(8진수로 8을 의미)이 돼요.
16개의 숫자가 필요한데 숫자는 10개(0~9)뿐이라, 부족한 6개는 알파벳 A, B, C, D, E, F로 10, 11, 12, 13, 14, 15를 표현해요.
0, 1, 2, ..., 9, A, B, C, D, E, F, 10, 11, ...
| 10진수 | 16진수 |
|---|---|
| 9 | 9 |
| 10 | A |
| 11 | B |
| 12 | C |
| 13 | D |
| 14 | E |
| 15 | F |
| 16 | 10 |
F(15) 다음에는 "10"(16진수로 16을 의미)이 돼요.
지금까지 본 규칙을 정리하면:
N진법은 0부터 (N-1)까지, 총 N개의 숫자(또는 기호)를 사용하고, N개를 다 쓰면 자리를 올리는 방법이에요.
| 진법 | 사용하는 숫자 | 자리올림 시점 |
|---|---|---|
| 2진법 | 0, 1 | 2가 되면 |
| 3진법 | 0, 1, 2 | 3이 되면 |
| 4진법 | 0, 1, 2, 3 | 4가 되면 |
| 8진법 | 0~7 | 8이 되면 |
| 10진법 | 0~9 | 10이 되면 |
| 16진법 | 0 | 16이 되면 |
✏️ 직접 해보기: 3진법으로 0부터 10까지 세어보세요. 정답: 0, 1, 2, 10, 11, 12, 20, 21, 22, 100, 101
같은 수를 여러 진법으로 표현할 수 있어요. 서로 변환하는 방법을 알아볼게요.
10진법에서 "123"은 1×100 + 2×10 + 3×1 이에요. 즉 각 자리마다 **자릿값(10의 거듭제곱)**을 곱해서 더한 값이지요.
N진법도 똑같아요. 자릿값으로 **N의 거듭제곱(N⁰, N¹, N², ...)**을 사용해요.
예제 1) 2진수 1011 → 10진수
1×2³ + 0×2² + 1×2¹ + 1×2⁰
= 1×8 + 0×4 + 1×2 + 1×1
= 8 + 0 + 2 + 1 = 11
예제 2) 8진수 17 → 10진수
1×8¹ + 7×8⁰ = 8 + 7 = 15
예제 3) 16진수 2F → 10진수
2×16¹ + 15×16⁰ = 32 + 15 = 47 (F는 15를 의미해요!)
10진수를 N으로 계속 나누면서 나머지를 적고, 마지막에 나머지를 거꾸로 읽으면 N진수가 돼요.
예제 1) 13을 2진수로
13 ÷ 2 = 6 ... 나머지 1
6 ÷ 2 = 3 ... 나머지 0
3 ÷ 2 = 1 ... 나머지 1
1 ÷ 2 = 0 ... 나머지 1
나머지를 아래에서 위로 읽으면 → 1101
예제 2) 100을 16진수로
100 ÷ 16 = 6 ... 나머지 4
6 ÷ 16 = 0 ... 나머지 6
나머지를 아래에서 위로 읽으면 → 64 (16진수 64는 10진수 100과 같아요!)
✏️ 직접 해보기: 25를 2진수로 바꿔보세요. 정답: 11001
서로 다른 두 진법(N진법, M진법) 사이를 바로 바꾸는 공식은 없어요. 대신 10진수를 다리(중간 단계)로 거쳐가면 항상 변환할 수 있어요.
예제) 8진수 17을 16진수로 바꾸기
1단계 (8진수 → 10진수): 1×8 + 7 = 15
2단계 (10진수 → 16진수): 15 ÷ 16 = 0 ... 나머지 15(F) → F
→ 8진수 17 = 16진수 F (둘 다 10진수 15와 같아요)
8(=2³)과 16(=2⁴)은 2의 거듭제곱이라서, 2진수와 아주 특별한 관계가 있어요.
이 사실을 이용하면 자릿값 계산 없이, 2진수를 3자리씩 또는 4자리씩 묶기만 하면 빠르게 변환할 수 있어요.
예제) 8진수 17 → 2진수 → 16진수
1단계 (8진수 → 2진수, 한 자리를 3비트로): 1 = 001, 7 = 111 → 001 111 → 앞의 0을 지우면 1111
2단계 (2진수 → 16진수, 4비트씩 묶기): 1111 → F
→ 8진수 17 = 2진수 1111 = 16진수 F = 10진수 15 (모두 같은 수예요!)
✏️ 직접 해보기: 2진수 110101을 8진수와 16진수로 각각 바꿔보세요.
- 8진수: 3비트씩 묶기 →
110 101→ 6, 5 → 65- 16진수: 4비트씩 묶기 →
0011 0101→ 3, 5 → 35
0부터 16까지를 10진수, 8진수, 2진수, 16진수로 동시에 적어보면 이렇게 돼요.
| 10진수 | 8진수 | 2진수 | 16진수 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 2 | 10 | 2 |
| 3 | 3 | 11 | 3 |
| 4 | 4 | 100 | 4 |
| 5 | 5 | 101 | 5 |
| 6 | 6 | 110 | 6 |
| 7 | 7 | 111 | 7 |
| 8 | 10 | 1000 | 8 |
| 9 | 11 | 1001 | 9 |
| 10 | 12 | 1010 | A |
| 11 | 13 | 1011 | B |
| 12 | 14 | 1100 | C |
| 13 | 15 | 1101 | D |
| 14 | 16 | 1110 | E |
| 15 | 17 | 1111 | F |
| 16 | 20 | 10000 | 10 |
8은 2진수로 4자리(1000), 8진수로는 자리올림이 일어나서 "10"이 되고, 16은 2진수로 5자리(10000), 16진수로는 자리올림이 일어나서 "10"이 돼요. 8 = 2³, 16 = 2⁴이기 때문에 8진수와 16진수는 2진수를 3자리/4자리씩 묶은 것과 정확히 일치해요.
다음 레슨 출력문부터는 이 진법으로 표현된 값을 화면에 출력하는 방법을 배워요!