Skip to Content
독학사독학사 2단계논리회로06. 수 체계와 진법 변환 (2·8·10·16진)

이번 문서의 목표: 이 문서를 다 읽으면 2·8·10·16진수 사이를 손으로 계산해 변환하고, 정수부와 소수부를 각각 다른 방법으로 변환해야 하는 이유를 설명하며, 주어진 비트 수로 표현 가능한 범위를 계산해 오버플로 여부를 판단할 수 있다.

왜 컴퓨터는 여러 진법을 오가며 쓰는가

컴퓨터 내부의 모든 회로는 전압이 높다/낮다 두 가지 상태만 안정적으로 구별한다. 전압을 0부터 9까지 열 단계로 정밀하게 구분하는 회로를 만들기보다, 두 단계만 구별하는 회로를 만드는 쪽이 훨씬 간단하고 잡음(noise, 원치 않는 전기적 흔들림)에도 강하다. 그래서 컴퓨터는 내부적으로 2진수(binary, 밑을 2로 하는 수 체계)만 사용한다.

문제는 2진수가 사람에게는 너무 길고 읽기 불편하다는 점이다. 예를 들어 10진수 202를 2진수로 쓰면 11001010처럼 자리 수가 훨씬 길어진다. 그래서 사람이 2진수를 다루는 문서·회로도·주소값을 더 짧고 읽기 쉽게 표기하기 위해 8진수(octal, 밑이 8)와 16진수(hexadecimal, 밑이 16)를 함께 쓴다. 8진수와 16진수는 2진수 3자리, 4자리와 정확히 맞아떨어지기 때문에(그 이유는 이 문서 뒷부분에서 다룬다) 2진수와 아주 쉽게 오갈 수 있다.

쉽게 말하면: 컴퓨터는 0과 1만 알아듣지만, 사람이 그 긴 0과 1의 나열을 편하게 읽으려고 8진법·16진법이라는 “축약 표기법”을 함께 쓴다.

자리값과 기수 — 모든 진법의 공통 원리

02편(진법 읽기 준비)에서 자리값의 직관을 미리 다뤘다면, 여기서는 그 원리를 시험에 나오는 수준으로 정확히 공식화한다. 어떤 진법이든 수를 나타내는 원리는 동일하다. 각 자리(digit, 숫자 하나가 차지하는 위치)마다 고유한 자리값(place value)이 있고, 그 자리의 숫자와 자리값을 곱해 모두 더하면 전체 값이 된다.

이때 자리값을 결정하는 기준이 기수(radix 또는 base, 밑)다. 기수가 rr인 진법에서, 소수점을 기준으로 왼쪽 kk번째 자리(0번째부터 시작)의 자리값은 rkr^k이고, 소수점 오른쪽 kk번째 자리의 자리값은 rkr^{-k}다. 정수부와 소수부를 포함한 일반식은 다음과 같다.

N=i=mn1di×riN = \sum_{i=-m}^{n-1} d_i \times r^i
  • NN: 표현하고자 하는 값
  • did_i: ii번째 자리의 숫자(기수 rr진법에서는 00부터 r1r-1까지의 값만 올 수 있다)
  • rr: 기수(2진이면 2, 8진이면 8, 10진이면 10, 16진이면 16)
  • ii: 자리 번호(정수부는 0, 1, 2, …로 왼쪽으로 갈수록 커지고, 소수부는 -1, -2, …로 오른쪽으로 갈수록 작아진다)

10진수 4728을 이 공식으로 풀어 보면, 4728=4×103+7×102+2×101+8×1004728 = 4 \times 10^3 + 7 \times 10^2 + 2 \times 10^1 + 8 \times 10^0이 된다. 진법이 바뀌어도 이 구조는 그대로이며, 기수 rr과 각 자리에 올 수 있는 숫자의 범위만 바뀐다.

진법기수 rr각 자리에 올 수 있는 숫자표기 예
2진(binary)20, 11011
8진(octal)80–713
10진(decimal)100–911
16진(hexadecimal)160–9, A–F(10–15)B₁₆

16진수에서 10부터 15까지는 숫자 한 자리로 표기할 수 없으므로 알파벳 A, B, C, D, E, F를 각각 10, 11, 12, 13, 14, 15에 대응시킨다. 시험에서 16진수 표기를 볼 때 A~F가 나오면 곧바로 대응하는 10진수 값을 떠올릴 수 있어야 한다.

쉽게 말하면: 어느 진법이든 “자리마다 무게(자리값)를 곱해서 더한다”는 원리는 똑같다. 기수가 얼마인지, 각 자리에 몇까지 쓸 수 있는지만 다르다.

진법을 나타낼 때의 표기 관습

같은 숫자 11이 2진수인지 10진수인지 16진수인지 표기만 봐서는 헷갈릴 수 있으므로, 시험과 교재에서는 아래 첨자로 기수를 표시하는 관습을 쓴다. 예를 들어 1011₂는 2진수 1011을, 1011₁₆은 16진수 1011을 뜻한다. 별도 표기가 없으면 보통 10진수로 간주한다. 이 시리즈에서도 진법이 문맥상 분명하지 않을 때는 아래 첨자나 “(2진)“처럼 괄호로 진법을 명시한다.

정수부 변환 알고리즘 — 10진수를 다른 진법으로

10진수 정수를 다른 진법(기수 rr)으로 바꾸는 표준 절차는 나누기-나머지법(division-remainder method)이다. 원리는 간단하다. 10진수를 기수 rr로 반복해서 나누면서 나머지를 기록하고, 몫이 0이 될 때까지 반복한 뒤, 나머지를 마지막에 구한 것부터 거꾸로 읽으면 그것이 답이다.

예제: 10진수 156을 2진수로 변환

1단계: 156을 2로 나눈다

156 ÷ 2 = 78, 나머지 0

2단계: 몫 78을 다시 2로 나눈다

78 ÷ 2 = 39, 나머지 0

3단계: 몫 39를 다시 2로 나눈다

39 ÷ 2 = 19, 나머지 1

4단계: 몫 19를 다시 2로 나눈다

19 ÷ 2 = 9, 나머지 1

5단계: 몫 9를 다시 2로 나눈다

9 ÷ 2 = 4, 나머지 1

6단계: 몫 4를 다시 2로 나눈다

4 ÷ 2 = 2, 나머지 0

7단계: 몫 2를 다시 2로 나눈다

2 ÷ 2 = 1, 나머지 0

8단계: 몫 1을 다시 2로 나눈다

1 ÷ 2 = 0, 나머지 1 (몫이 0이 되었으므로 종료)

나머지를 구한 순서는 0, 0, 1, 1, 1, 0, 0, 1이었다. 이것을 마지막에 구한 나머지부터 거꾸로 읽으면 10011100이 된다. 즉 156(10진) = 10011100(2진)이다.

검산해 보자. 1×27+0×26+0×25+1×24+1×23+1×22+0×21+0×201 \times 2^7 + 0 \times 2^6 + 0 \times 2^5 + 1 \times 2^4 + 1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 0 \times 2^0을 계산하면 128+16+8+4=156128 + 16 + 8 + 4 = 156으로 원래 값과 일치한다.

같은 절차를 8진법·16진법에도 그대로 적용할 수 있다. 156을 16으로 나누면 156 ÷ 16 = 9, 나머지 12(16진수로는 C)이고, 몫 9를 다시 16으로 나누면 9 ÷ 16 = 0, 나머지 9다. 나머지를 거꾸로 읽으면 9C(16진)가 된다.

쉽게 말하면: 정수를 바꿀 진법의 기수로 계속 나누면서 나머지를 순서대로 적어 두고, 다 끝나면 그 나머지들을 거꾸로 읽으면 답이다.

소수부 변환 알고리즘 — 정수부와 다른 방법이 필요한 이유

소수부는 나누기가 아니라 곱하기-정수부 취하기법(multiplication-integer method)을 쓴다. 정수부처럼 나누기를 쓰면 안 되는 이유는, 소수부의 자리값이 r1,r2,r^{-1}, r^{-2}, \dots처럼 음의 지수이기 때문이다. 어떤 소수에 기수 rr을 곱하면, 소수점이 오른쪽으로 한 자리 이동한 것과 같은 효과가 나서 정수부에 다음 자리의 숫자가 나타난다.

예제: 10진수 0.625를 2진수로 변환

1단계: 0.625에 2를 곱한다

0.625 × 2 = 1.25 → 정수부 1, 남은 소수부 0.25

2단계: 남은 소수부 0.25에 2를 곱한다

0.25 × 2 = 0.5 → 정수부 0, 남은 소수부 0.5

3단계: 남은 소수부 0.5에 2를 곱한다

0.5 × 2 = 1.0 → 정수부 1, 남은 소수부 0.0 (소수부가 0이 되었으므로 종료)

이번에는 정수부와 달리 구한 순서 그대로 위에서 아래로 읽는다. 1, 0, 1이므로 0.625(10진) = 0.101(2진)이다.

검산하면 1×21+0×22+1×23=0.5+0+0.125=0.6251 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3} = 0.5 + 0 + 0.125 = 0.625로 일치한다.

모든 소수가 이렇게 유한한 자리에서 정확히 끝나는 것은 아니다. 예를 들어 10진수 0.1을 2진수로 변환하면 0.1 × 2 = 0.2, 0.2 × 2 = 0.4, 0.4 × 2 = 0.8, 0.8 × 2 = 1.6, 0.6 × 2 = 1.2 … 처럼 정수부가 0과 1을 반복하며 끝없이 순환한다(0.0001100110011...). 이는 10진 소수 0.1이 2진법으로는 정확히 표현되지 않는다는 뜻이며, 부동소수점 연산에서 미세한 오차가 발생하는 근본 원인이기도 하다. 시험에서는 보통 유한한 자리에서 끝나는 소수를 다루지만, 왜 이런 순환이 생기는지 원리를 알아 두면 “옳지 않은 것 고르기” 유형에서 도움이 된다.

쉽게 말하면: 정수부는 나누고 나머지를 거꾸로 읽지만, 소수부는 곱하고 튀어나온 정수부를 순서대로 그대로 읽는다. 방향이 서로 반대라는 점이 시험에서 가장 헷갈리는 부분이다.

2진수와 8진수·16진수 사이의 빠른 변환

2진수를 8진수나 16진수로 바꿀 때는 나누기-나머지법을 쓸 필요 없이, 비트를 묶어서 바로 읽는 훨씬 빠른 방법이 있다. 이것이 8진·16진이 “2진수의 축약 표기”로 불리는 이유다.

  • 8=238 = 2^3이므로, 2진수를 소수점 기준으로 3비트씩 묶으면 각 묶음이 8진수 한 자리와 정확히 대응한다.
  • 16=2416 = 2^4이므로, 2진수를 소수점 기준으로 4비트씩 묶으면 각 묶음이 16진수 한 자리와 정확히 대응한다.

예제: 2진수 10110101을 8진수와 16진수로

8진수로 바꾸려면 소수점(정수라면 오른쪽 끝)에서 시작해 3비트씩 묶는다. 10110101은 8비트이므로 3의 배수가 되도록 왼쪽에 0을 채워 010 110 101로 만든다. 각 묶음을 10진수로 읽으면 010 = 2, 110 = 6, 101 = 5이므로 8진수로 265가 된다.

16진수로 바꾸려면 4비트씩 묶는다. 10110101은 이미 8비트이므로 그대로 1011 0101로 나눈다. 1011 = 11(16진수 B), 0101 = 5이므로 16진수로 B5가 된다.

2진 묶음(3비트)8진수2진 묶음(4비트)16진수
000000000
001100011
010200102
011300113
100401004
101501015
110601106
111701117
10008
10019
1010A
1011B
1100C
1101D
1110E
1111F

반대로 8진수나 16진수를 2진수로 바꿀 때는 각 자리를 대응하는 비트 묶음으로 그대로 치환하면 된다. 예를 들어 16진수 2F는 2 = 0010, F = 1111이므로 이어 붙이면 00101111이다.

쉽게 말하면: 8진수는 2진수를 3비트씩, 16진수는 4비트씩 묶어서 읽은 것뿐이다. 그래서 나누기 없이 묶고 대응표만 외우면 순식간에 변환할 수 있다.

n비트로 표현 가능한 범위와 오버플로 직관

디지털 시스템은 항상 정해진 자릿수(비트 수)로 값을 저장한다. nn비트로 표현할 수 있는 부호 없는 정수(unsigned integer, 음수를 고려하지 않는 정수)의 개수는 각 비트가 0 또는 1 두 가지 상태를 가지므로 2n2^n가지이며, 그 범위는 다음과 같다.

0N2n10 \le N \le 2^n - 1
  • NN: 표현 가능한 값
  • nn: 비트 수
  • 2n2^n: nn비트가 가질 수 있는 전체 조합 수
  • 2n12^n - 1: 조합이 0부터 시작하므로 최댓값은 전체 개수보다 1 작다

예를 들어 4비트라면 24=162^4 = 16가지 조합이 가능하고, 표현 범위는 0부터 15(2412^4-1)까지다. 8비트라면 28=2562^8=256가지, 범위는 0부터 255까지다.

오버플로(overflow, 자리 넘침)는 계산 결과가 정해진 비트 수로 표현할 수 있는 최댓값을 넘어서서, 그 결과를 정확히 저장할 수 없게 되는 상황을 말한다. 예를 들어 4비트로 1111(15)과 0001(1)을 더하면 결과는 16인데, 16은 241=152^4-1=15를 넘으므로 4비트로는 표현할 수 없다. 실제 회로에서는 이 계산 결과가 10000(5비트)이 되어야 하지만 4비트 저장 공간에는 상위 비트가 잘려 나가 0000만 남고, 이것이 오버플로 상황이다. 부호 있는 수의 오버플로 판정 규칙은 08편(코드 체계 II: 보수·패리티·부호화)에서 2의 보수와 함께 더 정확히 다룬다.

쉽게 말하면: 상자 크기(비트 수)가 정해져 있는데 그보다 큰 값을 담으려 하면 넘쳐서 일부가 잘려 나간다. 그것이 오버플로다.

자주 틀리는 점

  • 정수부와 소수부 변환 방법을 반대로 적용하는 실수: 정수부는 나누고 나머지를 거꾸로 읽지만, 소수부는 곱하고 튀어나온 정수부를 순서대로(위에서 아래로) 읽는다. 두 방향이 반대라는 점을 혼동하기 쉽다.
  • 비트 묶음 개수를 3비트·4비트가 아닌 다른 수로 착각하는 실수: 8진수는 8=238=2^3이므로 3비트, 16진수는 16=2416=2^4이므로 4비트로 묶어야 한다.
  • 묶을 때 소수점 기준을 무시하고 왼쪽 끝부터 묶는 실수: 정수부는 소수점(오른쪽 끝)에서 왼쪽으로, 소수부는 소수점에서 오른쪽으로 각각 묶어 나가야 한다. 자릿수가 3 또는 4의 배수가 아니면 부족한 자리에 0을 채운다.
  • 2n2^n2n12^n-1을 혼동하는 실수: 2n2^n은 표현 가능한 조합의 개수이고, 2n12^n-1은 그중 최댓값이다. “4비트로 표현 가능한 값의 개수”를 물으면 16이 답이지만, “4비트로 표현 가능한 최댓값”을 물으면 15가 답이다.

핵심 정리

  • 모든 진법은 “자리마다 자리값을 곱해 더한다”는 같은 원리를 따르며, 기수 rr과 각 자리에 올 수 있는 숫자의 범위만 다르다.
  • 10진 정수를 다른 진법으로 바꿀 때는 나누기-나머지법(나누고 나머지를 거꾸로 읽음)을, 10진 소수를 바꿀 때는 곱하기-정수부 취하기법(곱하고 튀어나온 정수부를 순서대로 읽음)을 쓴다.
  • 2진수와 8진수는 3비트, 2진수와 16진수는 4비트 단위로 묶어서 나누기 없이 빠르게 상호 변환할 수 있다.
  • nn비트로 표현 가능한 부호 없는 정수의 범위는 0부터 2n12^n-1까지이며, 이 범위를 넘는 계산 결과는 오버플로가 발생한다.

마무리 복습

문제 14지선다
기수가 r인 진법에서 소수점 왼쪽 k번째 자리(0번째부터 시작)의 자리값으로 옳은 것은?
문제 24지선다
10진수 156을 2진수로 변환하는 나누기-나머지법의 절차로 옳은 것은?
문제 34지선다
10진수 0.625를 2진수로 변환하는 곱하기-정수부 취하기법에 대한 설명으로 옳은 것은?
문제 44지선다
2진수를 8진수로 변환할 때 비트를 묶는 단위와 그 이유로 옳은 것은?
문제 54지선다
16진수 2F를 2진수로 변환한 결과로 옳은 것은?
문제 64지선다
8비트로 표현 가능한 부호 없는 정수의 범위로 옳은 것은?

참고 자료

  • 국가평생교육진흥원 독학학위제  — 독학사 2단계 논리회로 평가영역과 학습정보를 확인할 수 있는 공식 자료.
  • IEEE  — 디지털 논리와 수 체계 표준화 관련 자료를 제공하는 국제 표준화 기구.
Last updated on