1의 보수 vs 2의 보수
2025. 2. 4. 16:54ㆍ소프트웨어/기초
1. 개요
컴퓨터에서 음수를 표현하는 방식에는 1의 보수(One’s Complement)와 2의 보수(Two’s Complement)가 있습니다.
이 두 방식은 음수를 저장할 수 있지만, 연산 효율성과 하드웨어 설계에서 큰 차이가 있습니다.
➡ 2의 보수는 하드웨어 최적화와 연산 안정성 덕분에 현대 컴퓨터에서 표준으로 사용됩니다.
2. 1의 보수 vs 2의 보수 변환 방식
✅ 1의 보수 변환 방법
- 모든 비트를 반전 (0 → 1, 1 → 0)
- 변환 완료 (추가 연산 없음)
✅ 2의 보수 변환 방법
- 모든 비트를 반전 (0 → 1, 1 → 0)
- 결과에 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 체크섬 계산 과정
- 패킷을 16비트 단위로 분할: 1001 0010 1101 0111
- 1의 보수 덧셈 수행:
1001 0010 1101 0111 + 0100 1011 1010 1001 = 1110 1110 1000 0000 - 캐리 발생 시 반영: 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의 보수가 현대 컴퓨터 시스템의 표준인 이유
- 단일 0 표현: 1의 보수의 +0/-0 문제 제거, 단일 0으로 메모리 효율 ↑
- 연산 최적화: 별도 자리올림 보정 없이 연산 가능, 캐리 무시 가능, 덧셈기 재사용
- 하드웨어 효율성: 기존 가산기를 재사용 가능
- 넓은 표현 범위: -128까지 표현 가능 (8비트 기준)
- 보안성 강화: -0 관련 오류 방지 (CVE-1996-2100)
➡ 2의 보수는 연산 효율성, 하드웨어 단순성, 보안성을 모두 갖춘 현대 시스템의 표준 음수 표현 방식이다.
'소프트웨어 > 기초' 카테고리의 다른 글
부동 소수점 - 1. 부동 소수점이란? (0) | 2025.02.08 |
---|---|
부호 있는 정수(Signed Integer) vs 부호 없는 정수(Unsigned Integer) (0) | 2025.02.04 |
2의 보수(Two’s Complement) 정리 (0) | 2025.02.04 |
1의 보수(One’s Complement) 정리 (0) | 2025.02.04 |
오픈 데이터 라이선스 정리 (0) | 2025.02.01 |