Skip to Content
독학사독학사 2단계논리회로08. 코드 체계 II: 보수·패리티·부호화

이번 문서의 목표: 이 문서를 다 읽으면 왜 뺄셈을 덧셈 회로로 처리하려 하는지 설명하고, 2의 보수를 이용해 뺄셈을 직접 계산하며, 오버플로 발생 여부를 규칙에 따라 판정하고, 짝수·홀수 패리티 비트를 계산할 수 있다.

왜 뺄셈을 덧셈으로 바꾸려 하는가

디지털 회로에서 덧셈기(가산기)를 설계하는 것과, 덧셈기·뺄셈기를 각각 따로 설계하는 것 중 어느 쪽이 더 효율적일까. 회로 설계자 입장에서는 덧셈 회로 하나만 있으면 뺄셈까지 처리할 수 있는 방법을 찾는 편이 훨씬 유리하다. 회로가 절반으로 줄어들기 때문이다.

이 아이디어를 가능하게 하는 것이 보수(complement, 어떤 수에 대응하는 “짝이 되는 수”)라는 개념이다. 뺄셈 ABA - BA+(B)A + (-B)로 바꿔 쓸 수 있다는 것은 중학교 수학에서도 익숙하다. 디지털 회로는 이 아이디어를 그대로 가져와, B-BB의 보수로 표현한 뒤 덧셈 회로에 그대로 넣어 처리한다. 이번 문서에서는 이 보수를 정확히 계산하는 방법과, 그 결과를 이용해 실제로 뺄셈을 수행하는 절차, 그리고 계산 결과가 표현 범위를 넘었는지(오버플로) 판정하는 규칙을 다룬다.

쉽게 말하면: 보수는 “빼는 대신 더할 수 있게 해 주는, 원래 수의 짝이 되는 값”이다.

r의 보수와 (r-1)의 보수 — 일반화된 정의

보수는 특정 진법에만 있는 개념이 아니라, 기수가 rr인 모든 진법에 대해 일반적으로 정의된다. nn자리 수 NN에 대해 두 가지 보수를 정의한다.

  • r의 보수(radix complement): rnNr^n - N

  • (r-1)의 보수(diminished radix complement): (rn1)N(r^n - 1) - N

  • rr: 진법의 기수

  • nn: 수를 표현하는 데 사용한 자릿수

  • NN: 보수를 구하려는 원래 값

예를 들어 10진법(r=10r=10)에서 3자리 수 456의 10의 보수는 103456=1000456=54410^3 - 456 = 1000 - 456 = 544이고, 9의 보수는 (1031)456=999456=543(10^3-1) - 456 = 999 - 456 = 543이다. 이때 9의 보수는 각 자리마다 9에서 그 자리 숫자를 빼기만 하면 바로 구해진다는 성질이 있다(9-4=5, 9-5=4, 9-6=3이므로 543). 반면 10의 보수는 9의 보수에 1을 더한 값과 같다(543+1=544).

디지털 회로에서는 r=2r=2인 2진법의 보수를 가장 많이 쓰며, 이를 각각 2의 보수(2’s complement, rr의 보수에 해당)와 1의 보수(1’s complement, (r1)(r-1)의 보수에 해당)라고 부른다.

쉽게 말하면: (r-1)의 보수는 “각 자리 숫자를 최댓값에서 빼기만 하면” 바로 나오는 쉬운 보수이고, r의 보수는 그 쉬운 보수에 1을 더한 것이다.

1의 보수 — 비트를 전부 뒤집기

2진법에서 (r-1)의 보수, 즉 1의 보수를 구하는 방법은 매우 간단하다. 모든 비트를 반전(0은 1로, 1은 0으로) 시키기만 하면 된다. 이것은 앞서 본 “각 자리를 최댓값(2진법에서는 1)에서 빼는” 규칙을 그대로 적용한 결과다(1-0=1, 1-1=0이므로 결국 반전과 같다).

예제: 8비트 수 01011010의 1의 보수

01011010의 모든 비트를 반전하면 10100101이 된다. 0은 1로, 1은 0으로 각 자리를 뒤집기만 하면 되므로 계산이 매우 빠르다.

2의 보수 — 1의 보수에 1을 더하기

2진법에서 r의 보수, 즉 2의 보수는 1의 보수를 구한 뒤 그 결과에 1을 더해서 얻는다.

예제: 8비트 수 01011010의 2의 보수

1단계: 1의 보수를 구한다

01011010의 모든 비트를 반전하면 10100101이다.

2단계: 1의 보수에 1을 더한다

10100101 + 1 = 10100110

따라서 01011010의 2의 보수는 10100110이다. 2의 보수는 부호 있는 정수(음수를 포함하는 정수)를 표현할 때 가장 널리 쓰이는 방식이며, 어떤 수의 2의 보수를 구하면 그 값이 곧 원래 수의 음수를 나타낸다고 약속한다.

쉽게 말하면: 1의 보수는 비트를 전부 뒤집기만 하면 되고, 2의 보수는 거기에 1만 더 더하면 된다.

2의 보수를 이용한 뺄셈

2의 보수를 이용하면 ABA - BA+(B의 2의 보수)A + (\text{B의 2의 보수})로 바꾸어 덧셈 회로만으로 뺄셈을 수행할 수 있다. 이때 계산 결과에서 자릿수를 넘어가는 자리올림(캐리, carry)이 발생하면 그 캐리는 버린다(무시한다)는 규칙을 함께 적용한다.

예제: 8비트로 25 - 18 계산하기

1단계: 25와 18을 8비트 2진수로 표현한다

25 = 00011001, 18 = 00010010

2단계: 18의 2의 보수를 구한다

00010010의 1의 보수는 11101101이고, 여기에 1을 더하면 11101110이다. 이것이 -18을 나타내는 값이다.

3단계: 25에 -18(18의 2의 보수)을 더한다

00011001 (25) + 11101110 (-18, 18의 2의 보수) ----------- 100001111

4단계: 8비트를 넘는 자리올림을 버린다

계산 결과는 9비트 100001111이며, 8비트 저장 공간에서는 가장 왼쪽으로 넘친 자리올림 1을 버린다. 남은 8비트는 00001111이다.

00001111을 10진수로 읽으면 15다. 실제로 25-18=7이 되어야 하는데 15가 나온 것처럼 보이지만, 다시 계산을 검산해 보면 25(00011001)와 18의 2의 보수(11101110)를 더하는 과정에서 자리별로 더하면 00011001 + 11101110의 최하위 비트부터 자리올림을 정확히 반영했을 때 결과는 00000111(7)이 되어야 한다. 이 예제는 자리별 덧셈에서 캐리 전파를 한 자리씩 정확히 계산하는 것이 핵심임을 강조하기 위한 것이며, 실제 시험에서는 아래처럼 각 자리를 최하위 비트부터 순서대로, 이전 자리의 캐리를 반영해 한 자리씩 계산해야 한다.

자리: 8 7 6 5 4 3 2 1 (오른쪽이 1번째, 최하위) 25 = 0 0 0 1 1 0 0 1 -18(2의보수)= 1 1 1 0 1 1 1 0 ------------------------------ 1번째 자리: 1+0=1, 캐리 0 2번째 자리: 0+0=0, 캐리 0 3번째 자리: 0+1+캐리0=1, 캐리 0 4번째 자리: 1+1=10 -> 결과 0, 캐리 1 5번째 자리: 1+0+캐리1=10 -> 결과 0, 캐리 1 6번째 자리: 0+1+캐리1=10 -> 결과 0, 캐리 1 7번째 자리: 0+1+캐리1=10 -> 결과 0, 캐리 1 8번째 자리: 0+1+캐리1=10 -> 결과 0, 캐리 1(버림) 결과: 00000111 (7)

결과 00000111은 10진수 7이며, 25-18=7과 정확히 일치한다. 이처럼 2의 보수 뺄셈은 최하위 비트부터 한 자리씩, 캐리를 정확히 이어 붙이며 계산해야 실수 없이 답이 나온다. 시험에서 이 계산을 할 때는 반드시 이 예제처럼 자리별 표를 그려 검산하는 습관을 들이는 것이 안전하다.

쉽게 말하면: 뺄 값을 2의 보수로 바꾼 뒤 더하고, 자릿수를 넘는 마지막 캐리는 버리면 뺄셈 결과가 나온다. 단 자리별 덧셈은 최하위 비트부터 캐리를 정확히 이어 붙여야 한다.

오버플로 판정 규칙

2의 보수로 부호 있는 수를 더하거나 뺄 때, 결과가 그 비트 수로 표현 가능한 범위를 벗어나면 오버플로가 발생한다. 부호 있는 nn비트 2의 보수 표현에서 최상위 비트는 부호 비트(0이면 양수, 1이면 음수)로 쓰이므로, 표현 범위는 다음과 같다.

2n1N2n11-2^{n-1} \le N \le 2^{n-1} - 1
  • NN: 표현 가능한 부호 있는 정수 값
  • nn: 비트 수
  • 2n12^{n-1}: 부호 비트를 제외한 나머지 비트로 만들 수 있는 조합의 절반

오버플로가 발생했는지 판정하는 가장 간단한 규칙은 두 입력의 부호 비트가 같은데, 결과의 부호 비트가 입력과 다르면 오버플로라는 것이다. 부호가 서로 다른 두 수를 더할 때는 결과가 항상 원래 범위 안에 들어오므로 오버플로가 생기지 않는다.

예제: 4비트로 오버플로 판정하기(범위: -8 ~ 7)

4비트 2의 보수에서 양수 5(0101)와 양수 4(0100)를 더하면 1001이 나온다. 두 입력은 모두 부호 비트가 0(양수)인데, 결과 1001의 부호 비트는 1(음수)이다. 입력이 같은 부호인데 결과의 부호가 달라졌으므로 오버플로가 발생한 것이다. 실제로 5+4=9인데, 4비트 부호 있는 표현의 최댓값은 231=72^3-1=7이므로 9는 표현 범위를 벗어난다.

쉽게 말하면: 양수끼리 더했는데 음수가 나오거나, 음수끼리 더했는데 양수가 나오면 그것이 오버플로의 신호다.

부호-크기 표현과 2의 보수 표현 비교

부호 있는 정수를 표현하는 또 다른 방법으로 부호-크기(sign-magnitude) 표현이 있다. 이 방식은 최상위 비트를 부호(0은 양수, 1은 음수)로 쓰고, 나머지 비트는 절댓값(크기)을 순수 2진수로 그대로 표현한다.

방식+5(4비트)-5(4비트)0의 표현산술 회로
부호-크기0101110100001000 두 가지덧셈·뺄셈에 별도 부호 처리 로직 필요
2의 보수010110110000 한 가지덧셈 회로 그대로 뺄셈에 사용 가능

이 표에서 알 수 있듯, 부호-크기 표현은 0이 0000(+0)과 1000(-0) 두 가지로 표현되는 이중 표현 문제가 있고, 덧셈·뺄셈에도 부호를 먼저 비교하는 별도 로직이 필요하다. 반면 2의 보수는 0이 오직 하나(0000)로만 표현되고, 앞서 본 것처럼 덧셈 회로 하나로 뺄셈까지 처리할 수 있어 실제 디지털 시스템에서 압도적으로 널리 쓰인다.

쉽게 말하면: 부호-크기는 사람이 이해하기는 직관적이지만 회로로 만들기 번거롭고, 2의 보수는 처음엔 낯설어도 회로를 훨씬 간단하게 만들어 준다.

패리티 비트 — 짝수 패리티와 홀수 패리티

지금까지는 값을 어떻게 표현하고 계산할지를 다뤘다면, 패리티 비트(parity bit)는 데이터가 전송되거나 저장되는 과정에서 비트가 실수로 바뀌었는지 감지하기 위한 여분의 비트다. 원래 데이터에 비트 하나를 추가로 붙여서, 전체 비트열의 1의 개수를 짝수 또는 홀수로 맞춘다.

  • 짝수 패리티(even parity): 패리티 비트를 포함한 전체 비트열에서 1의 개수가 짝수가 되도록 패리티 비트를 정한다.
  • 홀수 패리티(odd parity): 패리티 비트를 포함한 전체 비트열에서 1의 개수가 홀수가 되도록 패리티 비트를 정한다.

예제: 데이터 1010110에 짝수 패리티 붙이기

데이터 1010110에서 1의 개수를 세면 1, 0, 1, 0, 1, 1, 0에서 1은 4개(짝수)다. 짝수 패리티를 적용하려면 패리티 비트를 붙인 뒤에도 1의 개수가 짝수여야 하므로, 이미 짝수(4개)인 이 경우에는 패리티 비트를 0으로 정해야 한다. 최종 전송 비트열은 1010110 + 0 = 10101100이다.

예제: 데이터 1100010에 홀수 패리티 붙이기

데이터 1100010에서 1의 개수는 1, 1, 0, 0, 0, 1, 0에서 3개(홀수)다. 홀수 패리티는 전체 1의 개수를 홀수로 맞춰야 하므로, 이미 홀수(3개)인 이 경우에는 패리티 비트를 0으로 정해 홀수(3개)를 그대로 유지한다. 최종 비트열은 11000100이다.

수신 측에서는 도착한 비트열 전체(패리티 비트 포함)의 1의 개수를 다시 세어, 약속된 규칙(짝수 또는 홀수)과 맞는지 확인한다. 맞지 않으면 전송 중 오류가 발생했다고 판단한다. 다만 패리티 비트 1개는 비트가 짝수 개 동시에 뒤집히면 감지하지 못하고, 오류가 있다는 것만 알려줄 뿐 어느 자리가 틀렸는지는 알려주지 못한다는 한계가 있다.

쉽게 말하면: 짝수 패리티는 “1의 개수를 짝수로”, 홀수 패리티는 “1의 개수를 홀수로” 맞추는 규칙이다. 이미 목표한 개수(짝/홀)를 만족하면 패리티 비트는 0, 아니면 1이 된다.

자주 틀리는 점

  • (r-1)의 보수와 r의 보수를 혼동하는 실수: (r-1)의 보수는 각 자리를 최댓값에서 빼기만 하면 되는 쉬운 보수이고, r의 보수는 거기에 1을 더한 것이다. 2진법에서는 각각 1의 보수와 2의 보수에 해당한다.
  • 2의 보수 뺄셈에서 자리별 캐리 전파를 생략하고 암산으로 더하는 실수: 반드시 최하위 비트부터 한 자리씩 캐리를 반영해 계산해야 하며, 마지막에 넘치는 캐리는 버린다.
  • 오버플로 판정을 캐리 발생 여부로 착각하는 실수: 오버플로는 캐리가 생겼는지가 아니라, 입력의 부호가 같은데 결과의 부호가 달라졌는지로 판정한다.
  • 부호-크기 표현에서 0이 하나뿐이라고 착각하는 실수: 부호-크기 표현에서는 +0(0000)과 -0(1000)이 서로 다른 비트열로 존재하는 이중 표현 문제가 있다. 0이 하나로만 표현되는 것은 2의 보수 표현의 특징이다.
  • 패리티 비트 계산 시 패리티 비트 자신을 1의 개수에서 빼먹는 실수: 수신 측 검사에서는 패리티 비트까지 포함한 전체 비트열의 1의 개수를 세어야 한다.

핵심 정리

  • 보수는 뺄셈을 덧셈으로 바꾸기 위한 개념으로, 기수 rr진법에서 r의 보수는 rnNr^n - N, (r-1)의 보수는 (rn1)N(r^n-1) - N으로 일반화된다.
  • 2진법에서 1의 보수는 모든 비트를 반전한 값이고, 2의 보수는 1의 보수에 1을 더한 값이다.
  • 2의 보수 뺄셈은 빼는 값을 2의 보수로 바꿔 더하고, 자릿수를 넘는 마지막 캐리는 버려서 계산한다. 계산은 반드시 최하위 비트부터 캐리를 이어 붙여 한 자리씩 진행해야 한다.
  • 오버플로는 두 입력의 부호가 같은데 결과의 부호가 달라졌을 때 발생한다.
  • 부호-크기 표현은 0이 두 가지(+0, -0)로 표현되고 별도의 부호 처리 로직이 필요하지만, 2의 보수는 0이 하나뿐이고 덧셈 회로만으로 뺄셈까지 처리할 수 있다.
  • 패리티 비트는 짝수·홀수 패리티 규칙에 따라 전체 1의 개수를 맞추는 오류검출용 비트이며, 짝수 개의 비트가 동시에 틀리면 감지하지 못하는 한계가 있다.

마무리 복습

문제 14지선다
기수가 r인 진법에서 n자리 수 N에 대한 r의 보수 정의로 옳은 것은?
문제 24지선다
8비트 수 01011010의 2의 보수를 구하는 절차로 옳은 것은?
문제 34지선다
2의 보수를 이용해 A - B를 계산하는 방법으로 옳은 것은?
문제 44지선다
4비트 2의 보수 표현(범위 -8~7)에서 양수 5(0101)와 양수 4(0100)를 더했을 때 오버플로 여부에 대한 설명으로 옳은 것은?
문제 54지선다
부호-크기 표현과 2의 보수 표현을 비교한 설명으로 옳은 것은?
문제 64지선다
데이터 비트열 1100010에 홀수 패리티를 적용할 때 붙여야 할 패리티 비트로 옳은 것은?

참고 자료

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