프로그래밍 수업 첫 시간에 "컴퓨터는 0과 1만 이해한다"는 말을 듣는다. 그런데 코드를 짜다 보면 #FF5733 같은 16진수 색상 코드, 0b1010 같은 2진수 리터럴, 0777 같은 8진수 권한 값을 만나게 된다. 왜 10진수 하나로 통일하지 않는 걸까.
진법이란 무엇인가
숫자를 표현하는 방식이다. 우리가 일상에서 쓰는 10진수는 0~9까지 열 개의 기호를 쓴다. 9 다음에 한 자리가 올라가서 10이 된다. 같은 원리로 2진수는 0과 1만 써서 1 다음에 자릿수가 올라가 10(= 십진수 2)이 된다.
| 진법 | 사용 기호 | 십진수 10의 표현 |
|---|---|---|
| 2진수 | 0, 1 | 1010 |
| 8진수 | 0~7 | 12 |
| 10진수 | 0~9 | 10 |
| 16진수 | 0~9, A~F | A |
왜 10진수만 쓰면 안 되나
2진수: 하드웨어의 언어
컴퓨터 회로는 전기 신호의 켜짐(1)과 꺼짐(0)으로 동작한다. 메모리, CPU, 네트워크 전부 이 두 상태의 조합으로 데이터를 처리하기 때문에, 하드웨어 수준에서는 2진수가 가장 자연스러운 표현이다.
16진수: 2진수의 축약 표현
2진수로 쓰면 숫자가 너무 길어진다. 10진수 255를 2진수로 쓰면 11111111, 8자리다. 같은 값을 16진수로 쓰면 FF, 단 2자리. 16진수 한 자리가 2진수 4자리(4비트)에 정확히 대응되기 때문에 변환이 깔끔하다.
예시 IP 주소 192.168.1.1을 2진수로 풀면 11000000.10101000.00000001.00000001이다. 네트워크 서브넷 계산이나 비트 마스킹 작업에서는 이 2진수 표현을 직접 다뤄야 한다.8진수: 리눅스 파일 권한
리눅스에서 chmod 755 명령을 써봤다면 8진수를 이미 사용한 것이다. 7은 읽기+쓰기+실행(rwx = 111), 5는 읽기+실행(r-x = 101). 각 자릿수가 3비트에 대응되는 구조다.
변환 원리 간단 정리
10진수 → 2진수
나누기 2를 반복하고 나머지를 거꾸로 읽는다.
13 ÷ 2 = 6 나머지 1
6 ÷ 2 = 3 나머지 0
3 ÷ 2 = 1 나머지 1
1 ÷ 2 = 0 나머지 1
→ 결과: 1101
2진수 → 16진수
오른쪽부터 4자리씩 묶어서 16진수 한 자리로 바꾼다.
1101 0011 → D3
손으로 계산하면 한두 번은 되지만, 숫자가 커지면 실수가 나온다. 진법 변환기에 값을 입력하면 2진수, 8진수, 10진수, 16진수가 동시에 나오고, 2~36진법까지 사용자 정의 변환도 지원한다. ASCII 문자 코드 변환도 같은 화면에서 된다.
진법 변환은 컴퓨터를 다루는 한 계속 마주치는 작업이다. 원리를 한 번 이해해두면 색상 코드든, 네트워크 설정이든, 파일 권한이든 숫자가 읽히기 시작한다.