1의 보수 vs 2의 보수

2025. 2. 4. 16:54소프트웨어/기초

1. 개요

컴퓨터에서 음수를 표현하는 방식에는 1의 보수(One’s Complement)2의 보수(Two’s Complement)가 있습니다.
이 두 방식은 음수를 저장할 수 있지만, 연산 효율성과 하드웨어 설계에서 큰 차이가 있습니다.

2의 보수는 하드웨어 최적화와 연산 안정성 덕분에 현대 컴퓨터에서 표준으로 사용됩니다.


2. 1의 보수 vs 2의 보수 변환 방식

1의 보수 변환 방법

  1. 모든 비트를 반전 (0 → 1, 1 → 0)
  2. 변환 완료 (추가 연산 없음)

2의 보수 변환 방법

  1. 모든 비트를 반전 (0 → 1, 1 → 0)
  2. 결과에 1을 더함

1의 보수의 0 중복 문제

  • 1의 보수는 +0과 -0 두 개의 0을 가짐 (예: 4비트에서 0000(+0)과 1111(-0))
  • 연산 시 오류 가능성이 있으며, 메모리 낭비를 초래할 수 있음.
  • 예제: (+0) + (-0) = 1111 → 논리적 오류 가능성 존재.

2의 보수의 수학적 원리

  • N비트 시스템에서 정수 N의 2의 보수는 다음과 같이 계산됩니다:예: 8비트에서 -6을 2의 보수로 표현하는 경우: 2^8 - 6 = 256 - 6 = 250 (1111 1010)
  • 2^N - x (N: 비트 수, x: 변환할 숫자)

특수 케이스: 8비트 -128

  • 8비트에서 -128은 2의 보수 표현에서 10000000으로만 해석됩니다.
  • 반전 후 +1을 수행해도 동일한 값이 유지되므로, -(-128) 연산 시 표현 오류 발생.

비교 요약

항목  1의 보수 2의 보수
0 표현 +0/-0 존재 (중복) 단일 0 (효율적)
범위 대칭적 (-7~+7) 비대칭적 (-8~+7)
엔디언 독립적 (TCP 체크섬) 의존적 (시스템 간 변환 필요)

개선된 Python 코드 (부호 확장 지원)

# 2의 보수 변환 함수 (부호 확장 지원)
def to_twos_complement(n, bits=8):
    mask = (1 << bits) - 1
    if n >= 0: return n & mask
    return ((abs(n) ^ mask) + 1) & mask

예제 (4비트 표현)

십진수  1의 보수 2의 보수
+5 0101 0101
-5 1010 1011
+3 0011 0011
-3 1100 1101

3. 오버플로 처리 및 엔디언 독립성

오버플로 감지

  • 2의 보수 오버플로 감지 공식:
    Overflow = C_in ⊕ C_out
    → MSB 자리올림이 발생하는 경우 XOR 연산으로 검출.

오버플로 감지 회로

C_in  ──▶ XOR ──▶ Overflow
C_out ──▶ 

2의 보수는 하드웨어적으로 간단한 연산으로 오버플로를 검출 가능

표현 방식 오버플로 감지 방식
1의 보수 End-around carry (자리올림 보정 필요)
2의 보수 MSB 자리올림 검사로 간단하게 처리 가능

TCP 체크섬에서 1의 보수 사용 이유

  • 엔디언 독립성: 네트워크 패킷의 바이트 순서에 영향 없이 체크섬 계산 가능.
  • 순환 캐리 처리: 16비트 덧셈 시 초과된 캐리를 LSB에 자동 추가.

TCP 체크섬 계산 과정

  1. 패킷을 16비트 단위로 분할: 1001 0010 1101 0111
  2. 1의 보수 덧셈 수행:
    1001 0010 1101 0111 + 0100 1011 1010 1001 = 1110 1110 1000 0000
  3. 캐리 발생 시 반영: 1110 1110 1000 0001 → 엔디언 독립성과 순환 캐리 처리 강조.

하드웨어 구현 비교

1의 보수 2의 보수
XOR, AND, OR 조합 가산기 필요 Full Adder 직렬 연결로 단순화

4. 비트 확장 기법 및 최신 기술 동향

비트 확장: 32비트 → 64비트 변환

원본 (32비트) 1의 보수 확장 (64비트) 2의 보수 확장 (64비트)
0x0000FFFF 0xFFFF0000 0xFFFFFFFF

2의 보수는 MSB 복제 방식으로 간단하게 확장 가능

최신 기술 동향

  • RISC-V 아키텍처: 2의 보수 기반 연산 명령어 세트 표준화.
    예: RV32I 명령어 세트에서 SUB 연산은 2의 보수 덧셈으로 구현됨.
  • 양자컴퓨팅: IBM Q 시스템에서 2의 보수 연산 장치 채택.

역사적 배경

연도  기술 발전
1964년 IBM S/360, 2의 보수 산업 표준 채택
1981년 TCP/IP RFC 791, 1의 보수 체크섬 규격화

5. 결론

2의 보수가 현대 컴퓨터 시스템의 표준인 이유

  1. 단일 0 표현: 1의 보수의 +0/-0 문제 제거, 단일 0으로 메모리 효율 ↑
  2. 연산 최적화: 별도 자리올림 보정 없이 연산 가능, 캐리 무시 가능, 덧셈기 재사용
  3. 하드웨어 효율성: 기존 가산기를 재사용 가능
  4. 넓은 표현 범위: -128까지 표현 가능 (8비트 기준)
  5. 보안성 강화: -0 관련 오류 방지 (CVE-1996-2100)

2의 보수는 연산 효율성, 하드웨어 단순성, 보안성을 모두 갖춘 현대 시스템의 표준 음수 표현 방식이다.