Computer Science/basic

2의 보수와 보수법(Complement Number System)

c4fiber 2025. 4. 16. 11:57

Category: 개발 & 프로그래밍
Tags: complement, binary, number-system

1. 보수와 보수법의 차이

  • 보수(補數)
    • 어떤 수 A와 어떤 기준 B가 있을 때, A = B + C를 만족하는 수 C를 가리킨다.
    • 예: “4에 대한 15의 보수는 11이다” → 4 + 11 = 15
  • 보수법
    • 특정 기수(radix, base)를 사용해 각 자리수의 ‘보수’를 취해(로 변환해) 표기하는 방법을 말한다.
    • 예: 10진수에서 “9의 보수법”이라 하면, 각 자리수를 9에서 빼는 방식으로 표현한다
    • (여기에 추가로 +1을 하는 경우가 10의 보수법).

결국, “보수”는 “A에 대한 B의 보충 수”라는 ‘값’ 자체를 일컫고, “보수법”은 “그 값을 자리수마다 치환하여 표현하는 방법”을 가리킵니다.

 

즉. 컴퓨터는 음수를 표현할 때 "2의 보수를 사용한다" 라기보다 "2의 보수법을 사용한다" 라는 표현이 적절하다.

 

2. 기수법과 보수법

2.1 기수법 (Numeral System)

  • fixed-radix: 2진수(2), 10진수(10)처럼 기수를 고정하여 표현하는 방식
  • mixed-radix: 시간(시:분:초)처럼 각 자릿수마다 다른 기수로 표현하는 방식
    • 시간은 24시간 단위
    • 분, 초는 60 단위

2.2 보수법 (Complement Number System)

  • N-1 보수법: Radix - 1
    • 10진수에서 각 자리 d를 9에 대한 보수로 바꿔서 표현하는 것
      • (10 - 1) - d = 9 - d
    • 2진수에서 각 자리 d를 1에 대한 보수로 바꿔서 표현하는 것 (one’s complement 사용)
      • (2 - 1) - d = 1 - d로 바꾸는 것 
  • N 보수법: Radix
    • 10진수에서 (9의 보수를 취한 뒤) + 1 → 10의 보수법
    • 2진수에서 (1의 보수를 취한 뒤) + 1 → 2의 보수법  (two’s complement 사용)

 

예시: 10진수에서 9(N-1) 보수법과 10(N) 보수법을 이용해 표현한다면?

  • 10진수 13523에 대해 9의 보수법을 적용하면 86476
  • 여기서 1을 더해주면 86477

예시: 2진수에서 1(N-1)의 보수법과 2(N)의 보수법으로 각각 표현해본다면?

  • 2진수 1001에 대해 1의 보수를 취하면 0110
  • 여기에 1을 더하면 0111

3. 보수법을 사용하는 이유

  1. 가산기(Adder)만으로 뺄셈을 처리
    • 컴퓨터는 내부적으로 덧셈(가산기)만을 기본으로 쓰기 때문에, 뺄셈 역시 “덧셈”으로 변환해야 한다.
    • 보수를 이용하면 "A - B = A + (B에 대한 N의 보수) 수행 후 carry 버리기" 방식으로 쉽게 뺄셈을 수행할 수 있다.
      • 9 - 4 = 9 + 6 = 5 (15 이지만 가장 앞 1은 버린다.) 
        • 해석 : 9 - 4 = 9 + 6 - 10 = 4 과정에서 -10 연산을 가장 나중으로 미루고(14를 먼저 구하고), 자리올림수(carry)를 버려서 (-10 과 같은 연산) 9 - 5의 결과인 4를 얻는다.
      • 1001 - 0001 = 1001 + 1111 = 1000 (11000 이지만 가장 앞 1은 버린다)
        • 해석 : 1001 - 0001 = 1001 + 1111 - 10000 에서 11000 을 먼저 구하고 carry인 10000을 버려서 1000을 얻는다.
  2. 양수·음수 표현 및 판별 용이
    • 최상위 비트(MSB)로 음수 여부를 나타낼 수 있다.
      • 0101 은 양수
      • 1010 처럼 가장 왼쪽의 bit가 1이면 음수

 

4. 1의 보수법(One’s Complement)

  • 2진수에서 각 자리수에 대해 NOT을 취한 결과와 동일
  • 빠르고 간단하지만 +0과 -0이 따로 존재(이중 0 문제)

예시)

  • 0000(2)의 1에 대한 보수는 1111(2). 0은 음수처리해도 0인데 bit로는 1111 이므로 같은 0이 0000, 1111 두가지로 표현된다.

5. 2의 보수법(Two’s Complement)

  • 2진수에서 각 자리수에 대해 NOT을 취한 뒤 +1
  • 이중 0이 없다 → 구현이 편리, 현대 컴퓨터에서 표준 방식

예시)

  • 1001 → 1의 보수(0110) → +1 → 0111

6. 결론 및 후기

  • **보수(값)**와 **보수법(표기법)**을 구분해두면, 수학적인 의미와 구현 방식(컴퓨터 아키텍처에서 활용) 간 차이를 좀 더 명확히 이해할 수 있다.
  • 2의 보수법은 간단한 회로로 덧셈과 뺄셈을 동시에 해결하고, +0과 -0이 구분되지 않는다는 장점 때문에 널리 사용된다.
  • “폰 노이만이 2의 보수를 제시했다”는 일화가 있으나, 정확한 1차 사료를 찾기는 어렵다.

“쉽게 설명할 수 없다면 아직 충분히 이해한 것이 아니다.” – 리처드 파인만

  • 파인만 공부법을 떠올리며 정리했는데, 실제로 남에게 설명한다고 생각하면 내용의 빈틈을 발견하기 좋다.
  • 본 정리가 도움이 되었길 바랍니다.