2의 보수(Two’s Complement) 정리

2025. 2. 4. 13:50소프트웨어/기초

1. 개요

2의 보수(Two’s Complement)는 컴퓨터에서 부호 있는 정수 표현 방식 중 가장 널리 사용되는 방식입니다.
이진수에서 음수를 표현하는 방법으로, 모든 비트를 반전(1의 보수)한 후, 1을 더하는 방식을 사용합니다.

2의 보수의 핵심 특징

  • 0이 하나만 존재 (0000 0000 → 0)
  • 음수 표현 시 간단한 연산 가능
  • 덧셈과 뺄셈을 동일한 연산으로 수행 가능

2의 보수는 컴퓨터에서 음수를 표현하고 연산하는 가장 효율적인 방법입니다.


2. 2의 보수 변환 방법

2의 보수를 계산하는 방법은 다음과 같습니다.

2의 보수 변환 과정

  1. 1의 보수(비트 반전) 취하기
  2. 1을 더하기

예제 (4비트 표현)

+5 (십진수) → 0101 (이진수)
1의 보수    → 1010
2의 보수    → 1011 (-5) (2의 보수를 취하면 음수 5)
-3 (십진수) → 0011 (3의 이진수, 원래 부호 없음, 양수)
1의 보수    → 1100
2의 보수    → 1101 (-3) (-3을 2의 보수를 통해 이진수로 표기)

2의 보수를 사용하면 간단한 연산만으로 부호 변환이 가능함

n비트 2의 보수 표현 범위

  • 최솟값: -2^{n-1}
  • 최댓값: 2^{n-1} - 1
    예: 4비트 → -8 ~ +7

3. 2의 보수를 이용한 덧셈과 뺄셈

덧셈 예제: 4비트 시스템에서

  0011   (+3)
+ 1101   (-3)
--------
  0000   (0)

(+5) + (-2)

  0101   (+5)
+ 1110   (-2)
--------
  0011   (+3)

자리올림수 처리 없이 바로 결과 도출 가능

뺄셈 예제: 6 - 3

  0110   (+6)
- 0011   (+3)
--------
  0110   (+6)
+ 1101   (-3의 2의 보수)
--------
  0011   (+3)

2의 보수를 이용하면 뺄셈이 덧셈으로 변환됨

예외 사례: -8 + (-1) 연산

  1000   (-8)
+ 1111   (-1)
--------
  0111   (+7) → 오버플로우 발생

최소값을 벗어나는 연산은 항상 오버플로우 발생


4. 오버플로우 감지 회로 구현

자리올림수 비교

  • Overflow = MSB 자리올림수 입력 ⊕ MSB 자리올림수 출력
  • 하드웨어 수준에서 오버플로우를 감지하는 방법

예제: 4비트 7 + 3 연산

  0111   (+7)
+ 0011   (+3)
--------
  1010   (-6) → 오버플로우 발생 (자리올림수 입력 ≠ 자리올림수 출력)

오버플로우 감지 회로

➡ Overflow = Carry-in ⊕ Carry-out

프로그래밍 언어별 오버플로우 처리

언어  핵심 동작
C/C++ -fwrapv로 래핑 강제
Python 자동 정수 확장
Java 모든 정수 연산에서 2의 보수 래핑 강제
JavaScript 64비트 부동소수점으로 자동 변환
Rust overflowing_add()로 명시적 처리

5. 부호 확장 vs 제로 확장

확장 예시

  • 4비트 1011(-5) → 8비트:
    • 부호 확장: 1111 1011 (-5 유지)
    • 제로 확장: 0000 1011 (+11로 변환)
유형  4비트 1011 → 8비트 목적
부호 확장 1111 1011 음수 유지
제로 확장 0000 1011 양수 변환

6. 2의 보수 표준화 과정

  • 1949년 EDSAC: 최초 채택
  • 1954년 IBM 704: 상용 시스템 최초 표준화
  • 1980년대 x86 아키텍처: 현대 CPU 표준 방식 확립

2의 보수는 하드웨어 최적화 및 연산 효율성에서 중요한 역할을 합니다.


7. 1의 보수 vs 2의 보수 심층 비교

항목  1의 보수 2의 보수
0 표현 +0/-0 존재 단일 0
하드웨어 복잡도 높음 (Carry 보정 필요) 낮음 (직접 연산 가능)
최소값 (4비트) -7 -8

8. 결론

2의 보수는 현대 컴퓨터 시스템에서 표준적인 부호 있는 정수 표현 방식으로,
덧셈과 뺄셈을 동일한 방식으로 수행할 수 있으며, 오버플로우 처리가 필요하지만 효율적임.

2의 보수는 현재 모든 컴퓨터에서 사용되는 가장 효율적인 음수 표현 방법! 🚀

 

 

추가: 현대 CPU는 2의 보수로 변환할 때 우측에서 좌측으로 검색을해 첫번째 1을 발견하면 발견한 1의 좌측 비트들에 반전을 취해서 인버터 연산을 줄여서 더 효율적으로 변환한다. 결국 1의 보수보다 변환도 빠르다.