Skip to Content
독학사독학사 2단계논리회로15. 가산기·감산기와 산술 회로

이번 문서의 목표: 이 문서를 다 읽으면 반가산기·전가산기의 진리표에서 합·캐리 식을 직접 유도하고, 여러 개의 전가산기를 연결한 병렬 가산기로 다중 비트 덧셈을 계산하며, 2의 보수를 이용한 뺄셈과 오버플로 판정까지 실제 숫자로 검산할 수 있다.

왜 회로로 덧셈을 해야 하는가

08편에서 2의 보수를 이용하면 뺄셈을 덧셈으로 바꿀 수 있다는 것을 배웠다. 그런데 컴퓨터 내부에서 실제로 “숫자 두 개를 더한다”는 연산은 어떤 회로가 담당할까? 이번 편에서는 14편에서 배운 조합논리회로 설계 절차(진리표 → 불 함수 → 간소화 → 회로도)를 덧셈이라는 구체적인 문제에 그대로 적용해, 컴퓨터의 산술연산장치(ALU, Arithmetic Logic Unit)의 핵심 부품인 가산기(adder)를 처음부터 설계해 본다.

쉽게 말하면: 가산기는 “2진수 두 자리를 더해서 합과 자리올림을 동시에 계산하는 회로”이며, 이 작은 회로를 여러 개 이어붙이면 여러 자리 숫자 전체를 더하는 회로가 된다.

반가산기: 자리올림 입력이 없는 가장 단순한 덧셈

반가산기(half adder)는 두 개의 1비트 입력 AA, BB를 더해 (Sum, SS)과 자리올림(Carry, CC)을 출력하는 가장 단순한 덧셈 회로다. “반”(half)이라는 이름이 붙은 이유는, 뒤에서 배울 전가산기와 달리 이전 자리에서 넘어온 자리올림을 입력으로 받지 않기 때문이다. 즉 온전한 다중 비트 덧셈의 “절반” 기능만 한다는 뜻이다.

10진수 덧셈에서 1+1=21+1=2가 되어 자리올림이 발생하듯, 2진수 덧셈에서도 1+1=10(2)1+1=10_{(2)}(2진수로 10, 즉 십진수 2)이 되어 자리올림이 발생한다. 이를 진리표로 정리한다.

ABS(합)C(자리올림)
0000
0110
1010
1101

이 진리표를 14편의 설계 절차대로 분석한다. 출력이 두 개(SSCC)이므로 각각 따로 불 함수를 도출한다.

SS가 1인 행은 (A,B)=(0,1),(1,0)(A,B) = (0,1), (1,0)이다. 표준 SOP는 S=AˉB+ABˉS = \bar{A}B + A\bar{B}이며, 이는 09편에서 배운 XOR의 정의(두 입력이 다를 때만 1)와 정확히 같다. 따라서 다음처럼 XOR로 바로 쓸 수 있다.

S=ABS = A \oplus B

CC가 1인 행은 (A,B)=(1,1)(A,B) = (1,1) 하나뿐이므로 표준 SOP가 곧 최소식이다.

C=ABC = AB

즉 반가산기는 XOR 게이트 하나(합 계산)와 AND 게이트 하나(자리올림 계산)로 완성된다.

전가산기: 자리올림 입력까지 받는 실전용 가산기

실제 다중 비트 덧셈에서는 맨 오른쪽(최하위) 자리를 제외한 모든 자리가, 자기보다 오른쪽 자리에서 넘어온 자리올림을 함께 더해야 한다. 이를 위해 입력이 3개(더할 두 값 AA, BB와 이전 자리에서 넘어온 캐리 CinC_{in})인 전가산기(full adder)를 만든다.

ABCinC_{in}S(합)CoutC_{out}(자리올림)
00000
00110
01010
01101
10010
10101
11001
11111

SS의 도출: SS가 1인 행은 1개 입력만 1이거나(001, 010, 100) 세 입력 모두 1인 경우(111)다. 이는 “1의 개수가 홀수일 때 1”이 되는 패턴으로, 세 입력의 XOR과 정확히 같다.

S=ABCinS = A \oplus B \oplus C_{in}

자리올림 CoutC_{out}의 도출: CoutC_{out}이 1인 행은 011, 101, 110, 111이다. 표준 SOP는 다음과 같다.

Cout=AˉBCin+ABˉCin+ABCinˉ+ABCinC_{out} = \bar{A}BC_{in} + A\bar{B}C_{in} + AB\bar{C_{in}} + ABC_{in}

이 식은 14편에서 다룬 다수결 회로의 진리표와 완전히 같은 패턴(입력 3개 중 2개 이상이 1이면 출력 1)이다. 실제로 카르노맵으로 간소화하면 다음처럼 세 쌍의 AND를 OR로 묶은 형태가 나온다.

Cout=AB+BCin+ACinC_{out} = AB + BC_{in} + AC_{in}

전가산기는 이렇게 반가산기 두 개와 OR 게이트 하나로도 구현할 수 있다. 첫 번째 반가산기가 AABB를 더해 중간 합 S1=ABS_1 = A \oplus B와 중간 캐리 C1=ABC_1 = AB를 만들고, 두 번째 반가산기가 S1S_1CinC_{in}을 더해 최종 합 S=S1CinS = S_1 \oplus C_{in}과 중간 캐리 C2=S1CinC_2 = S_1 \cdot C_{in}을 만든 뒤, C1C_1C2C_2를 OR로 합쳐 Cout=C1+C2C_{out} = C_1 + C_2를 얻는다.

쉽게 말하면: 전가산기는 “반가산기 두 개를 연달아 쓰고, 두 반가산기에서 나온 자리올림을 OR로 합친 것”이다. 반가산기가 전가산기의 부품이 되는 구조다.

병렬 가산기: 여러 비트를 한 번에 더하기

여러 자리의 2진수를 동시에 더하려면 전가산기 여러 개를 옆으로 이어 붙인다. 이때 각 전가산기의 자리올림 출력 CoutC_{out}을 바로 다음 자리(한 단계 위) 전가산기의 자리올림 입력 CinC_{in}에 연결하는 방식을 리플 캐리(ripple carry, 파도처럼 넘실거리며 전달되는 자리올림) 가산기라고 부른다.

이 그림은 4비트 리플 캐리 가산기다. 최하위 자리(0번째)의 CinC_{in}은 보통 0으로 고정하고, 각 자리의 계산 결과가 다음 자리로 넘어가면서 계산이 왼쪽으로 퍼져 나간다.

실제 숫자로 계산해 보기: A=0110A = 0110(십진수 6), B=0011B = 0011(십진수 3)을 더해 본다.

자리(오른쪽부터)ABCinC_{in}SCoutC_{out}
0번째01010
1번째11001
2번째10101
3번째00110

결과는 S=1001(2)S = 1001_{(2)}이며, 이는 십진수로 8+1=98+1=9다. 실제로 6+3=96+3=9이므로 계산이 정확히 맞아떨어진다.

자주 틀리는 점: 자리올림을 더할 때 자리를 착각해 옆 열이 아니라 같은 열에 더하는 실수가 흔하다. 반드시 한 자리 아래(오른쪽)에서 넘어온 CoutC_{out}이 그 위(왼쪽) 자리의 CinC_{in}이 된다는 방향을 기억해야 한다.

전파 지연(propagation delay)이라는 문제도 함께 알아두어야 한다. 리플 캐리 가산기는 자리올림이 0번째 자리부터 순서대로 전달되어야 최종 결과가 확정되므로, 비트 수가 많아질수록(예: 32비트, 64비트) 맨 마지막 자리의 결과가 나올 때까지 기다려야 하는 시간이 길어진다. 이 지연을 줄이기 위해 실제 CPU에서는 캐리 예측 가산기(carry look-ahead adder) 같은 더 빠른 구조를 쓰지만, 그 세부 회로는 독학사 논리회로 출제범위를 넘어서므로 “리플 캐리보다 빠른 대안이 존재한다” 정도만 알아두면 충분하다.

2의 보수를 이용한 감산기

08편에서 배운 2의 보수(원래 수를 반전(1의 보수)한 뒤 1을 더한 값)를 이용하면, 별도의 뺄셈 회로 없이 가산기 하나로 덧셈과 뺄셈을 모두 처리할 수 있다. 원리는 AB=A+(B)A - B = A + (-B)이고, B-BBB의 2의 보수로 표현된다는 성질을 이용하는 것이다.

BB의 2의 보수를 만드는 과정(모든 비트를 반전한 뒤 1을 더함)은 회로로 만들면 모든 BB 비트를 XOR 게이트에 통과시키고, 이 XOR 게이트들에 공통으로 연결된 제어선을 1로 설정한 뒤, 최하위 자리 가산기의 CinC_{in}도 1로 설정하는 방식으로 구현할 수 있다. XOR 게이트는 한쪽 입력이 1이면 다른 쪽 입력을 반전하는 성질(9편에서 배운 X1=XˉX \oplus 1 = \bar{X})을 이용해, 제어선이 1일 때는 BB를 모두 반전(1의 보수)시키고, 이어서 Cin=1C_{in}=1을 더해 2의 보수를 완성한다. 제어선이 0이면 BB는 그대로 통과하고 Cin=0C_{in}=0이 되어 평범한 덧셈이 된다.

실제 숫자로 검산: 4비트 2의 보수 체계(표현 범위 8-8 ~ +7+7)에서 535 - 3을 계산해 본다.

  1. 55의 2진 표현: 01010101
  2. 33의 2진 표현: 00110011, 이를 1의 보수로 반전하면 11001100
  3. 11001100에 1을 더해 2의 보수(즉 3-3)를 만든다: 1100+1=11011100 + 1 = 1101
  4. 5+(3)5 + (-3)을 계산: 0101+11010101 + 1101

자리별 덧셈을 진행한다.

자리ABCinC_{in}SCoutC_{out}
0번째11001
1번째00110
2번째11001
3번째01101

결과는 S=0010(2)S = 0010_{(2)}이며, 이는 십진수 2다. 최상위 자리에서 나온 Cout=1C_{out}=1은 4비트를 벗어난 자리이므로 버린다(이 버려지는 캐리를 활용하는 방법은 다음 절에서 오버플로 판정과 함께 설명한다). 53=25-3=2이므로 계산이 정확히 일치한다.

쉽게 말하면: 뺄셈 회로를 따로 만들 필요 없이, 빼려는 수를 2의 보수로 바꾼 다음 그냥 더하기만 하면 가산기가 자동으로 뺄셈까지 처리해 준다.

오버플로 검사

오버플로(overflow)는 계산 결과가 정해진 비트 수로 표현할 수 있는 범위를 벗어나는 현상이다. 4비트 2의 보수 체계는 8-8부터 +7+7까지만 표현할 수 있으므로, 이 범위를 벗어나는 계산은 잘못된 결과를 만든다.

2의 보수 덧셈에서 오버플로를 판정하는 가장 간단한 규칙은 최상위 비트(부호 비트) 자리로 들어가는 캐리(Cn1C_{n-1})와 최상위 비트에서 나가는 캐리(CnC_n)를 XOR한 값이 1이면 오버플로가 발생했다고 보는 것이다.

Overflow=Cn1Cn\text{Overflow} = C_{n-1} \oplus C_n

실제 숫자로 검산: 4비트 범위(최댓값 +7+7)에서 5+45 + 4를 계산해, 범위를 벗어나는 상황을 만들어 본다. 5=01015 = 0101, 4=01004 = 0100.

자리ABCinC_{in}SCoutC_{out}
0번째10010
1번째00000
2번째11001
3번째(부호 비트)00110

결과는 S=1001(2)S = 1001_{(2)}인데, 부호 비트(맨 왼쪽)가 1이므로 이 값은 음수로 해석되어 십진수로 7-7이 된다. 그러나 실제 정답은 5+4=95+4=9로 양수여야 하므로, 명백히 틀린 결과다. 이때 최상위 비트로 들어간 캐리는 CinC_{in}(3번째 자리의 CinC_{in}) =1=1이고, 최상위 비트에서 나간 캐리는 CoutC_{out}(3번째 자리의 CoutC_{out}) =0=0이므로, 오버플로 판정식은 10=11 \oplus 0 = 1이 되어 오버플로가 정확히 감지된다.

또 다른 간단한 판정 방법으로, “두 입력의 부호가 같은데 결과의 부호가 다르면 오버플로”라는 규칙도 있다. 위 예제에서 두 입력 5544는 모두 양수(부호 비트 0)인데, 결과의 부호 비트는 1(음수)이므로 이 규칙으로도 오버플로가 감지된다. 반대로 부호가 다른 두 수를 더하는 경우(즉 뺄셈에 해당하는 상황)에는 오버플로가 절대 발생하지 않는다는 점도 함께 기억해 둔다.

자주 틀리는 점: 오버플로를 “최상위 자리에서 캐리가 발생하면 무조건 오버플로”라고 착각하는 경우가 많다. 앞의 535-3 예제에서도 최상위 자리 Cout=1C_{out}=1이 발생했지만 오버플로는 아니었다. 반드시 부호 비트로 들어가는 캐리와 나가는 캐리를 XOR해서 판정해야 하며, 부호 없는(unsigned) 수의 덧셈에서는 오버플로 판정 기준 자체가 다르다는 점(부호 없는 수는 최상위 캐리 발생 자체가 곧 오버플로다)도 구분해야 한다.

자주 틀리는 점 (종합)

  • 반가산기와 전가산기를 입력 개수로 구분하지 못하는 실수: 반가산기는 입력 2개(자리올림 입력 없음), 전가산기는 입력 3개(이전 자리올림 포함)다.
  • 전가산기의 합 식을 AND·OR만으로 잘못 유도하는 실수: 합 SS는 세 입력의 XOR(ABCinA \oplus B \oplus C_{in})이며, 이는 카르노맵으로 묶어도 더 간단한 AND-OR 형태로 줄어들지 않는 특수한 패턴이다.
  • 리플 캐리 가산기에서 자리올림 방향을 반대로 연결하는 실수: 반드시 하위 자리의 CoutC_{out}이 상위 자리의 CinC_{in}으로 이어져야 한다.
  • 2의 보수 뺄셈에서 1을 더하는 단계를 빠뜨리는 실수: 1의 보수(비트 반전)만 하고 1을 더하지 않으면 2의 보수가 되지 않아 계산이 틀어진다.
  • 부호 있는 수와 부호 없는 수의 오버플로 판정 기준을 혼동하는 실수: 부호 있는(2의 보수) 수는 부호 비트로 들어가고 나가는 캐리의 XOR로, 부호 없는 수는 최상위 자리의 캐리 발생 자체로 오버플로를 판정한다.

핵심 정리

  • 반가산기는 XOR(합)과 AND(자리올림) 게이트로 만들며, 자리올림 입력을 받지 않는다.
  • 전가산기는 세 입력의 XOR로 합을, 다수결 패턴(AB+BCin+ACinAB+BC_{in}+AC_{in})으로 자리올림을 계산하며, 반가산기 두 개와 OR 게이트 하나로도 구성할 수 있다.
  • 리플 캐리 가산기는 전가산기를 여러 개 이어 붙여 다중 비트 덧셈을 하며, 하위 자리의 캐리 출력이 상위 자리의 캐리 입력으로 전달된다.
  • 2의 보수를 이용하면 별도의 감산기 없이 가산기 하나로 덧셈과 뺄셈을 모두 처리할 수 있다.
  • 부호 있는 수의 오버플로는 부호 비트로 들어가는 캐리와 나가는 캐리를 XOR해서 판정하며, 최상위 자리 캐리 발생 자체만으로는 판단할 수 없다.

마무리 복습

문제 14지선다
반가산기와 전가산기의 가장 근본적인 차이는?
문제 24지선다
전가산기에서 합(S)을 계산하는 식으로 옳은 것은?
문제 34지선다
4비트 리플 캐리 가산기에서 1번째 자리(두 번째 전가산기)의 Cin은 어디서 오는가?
문제 44지선다
2의 보수를 이용해 A - B를 계산하는 올바른 절차는?
문제 54지선다
4비트 2의 보수 체계에서 5 + 4를 계산했을 때 결과가 1001(십진수로 해석하면 -7)이 나왔다. 오버플로 발생 여부를 올바르게 판정하는 방법은?
문제 64지선다
두 개의 반가산기와 OR 게이트 하나로 전가산기를 구성할 때, 최종 자리올림 Cout을 얻는 방법은?

참고 자료

Last updated on