2025. 2. 4. 13:50ㆍ소프트웨어/기초
1. 개요
2의 보수(Two’s Complement)는 컴퓨터에서 부호 있는 정수 표현 방식 중 가장 널리 사용되는 방식입니다.
이진수에서 음수를 표현하는 방법으로, 모든 비트를 반전(1의 보수)한 후, 1을 더하는 방식을 사용합니다.
✅ 2의 보수의 핵심 특징
- 0이 하나만 존재 (0000 0000 → 0)
- 음수 표현 시 간단한 연산 가능
- 덧셈과 뺄셈을 동일한 연산으로 수행 가능
➡ 2의 보수는 컴퓨터에서 음수를 표현하고 연산하는 가장 효율적인 방법입니다.
2. 2의 보수 변환 방법
2의 보수를 계산하는 방법은 다음과 같습니다.
✅ 2의 보수 변환 과정
- 1의 보수(비트 반전) 취하기
- 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의 보수보다 변환도 빠르다.
'소프트웨어 > 기초' 카테고리의 다른 글
부호 있는 정수(Signed Integer) vs 부호 없는 정수(Unsigned Integer) (0) | 2025.02.04 |
---|---|
1의 보수 vs 2의 보수 (0) | 2025.02.04 |
1의 보수(One’s Complement) 정리 (0) | 2025.02.04 |
오픈 데이터 라이선스 정리 (0) | 2025.02.01 |
오픈소스 라이선스 정리 (0) | 2025.02.01 |