2의 보수
2025. 4. 16. 18:03ㆍJAVA/JAVA 실행 원리
💾 2의 보수란?
2의 보수는 컴퓨터에서 음수를 표현하는 방법 중 가장 일반적인 방식이다.
자바는 내부적으로 2의 보수 체계를 사용해서 정수형(int, byte, short, long)의 음수를 저장한다.
💽 2의 보수 이전 시대
1. 부호-절댓값(Sign-Magnitude) 표현 방식
┌──── 절댓 값 ────┐
| MSB 2⁷ |
0000000000 | LSB 2⁰ |
sign bit
┌ 0 : 양수
└ 1 : 음수
- 가장 왼쪽 비트(MSB)를 부호로 사용 ( 0 = 양수, 1= 음수)
- 나머지 비트는 절댓값만 표현
❓ 예제
| +5 | 0000 0101 |
| -5 | 1000 0101 |
⚠️ 문제점
- +0과 -0이 따로 존재(0000 0000, 1000 0000) → 비효율
- 덧셈 회로가 복잡해짐 (음수 더할 때는 연산 방식이 달라짐)
2. 1의 보수(One's Complement) 표현 방식
1번의 방식을 차용하고 음수는 추가로 각 bit를 반전시킴
❓ 예제
| +5 | 0000 0101 |
| bit 반전 | |
| -5 | 1111 1010 |
⚠️ 문제점
- 여전히 +0과 -0이 존재 (0000 0000, 1111 1111)
- 덧셈 시 캐리 비트를 별도로 더해야 함 → 연산 속도 저하
‼️ 그래서 나온 것이 2의 보수 ‼️
2의 보수는 1의 보수에 + 1을 한 방식
- +0과 -0 (0000 0000) 중복 해결
- 뺄셈을 덧셈으로 통일 가능
- 하드웨어가 더 단순하고 빠르게 계산 가능
❓ 예제
-128을 구할 때
| 128 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||
↓ 1의 보수
| bit반전 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||
↓ + 1
| -128 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||
🎥 왜 2의 보수가 승자가 되었는가?
| 항목 | 설명 |
| 하드웨어 구현 용이성 | 뺄셈도 덧셈 회로 하나로 처리 가능 → 회로 구조 단순화 |
| 0의 개수 | +0, -0 없이 단 하나의 0(0000 0000)만 존재 |
| 음수 표현 방식 | 비트 반전후 +1만 하면 끝 → 계산과 구현 간편 |
| 덧셈/뺄셈 일관성 | 뺄셈을 덧셈으로 통일 → 코드 및 하드웨어 효율 상승 |
| 정렬 시 자연스러운 순서 | 이진수 비교 시 음수-양수 순서가 올바르게 정렬됨 |
💽 Primitive Data Type에서 2의 보수
| 타입 | 크기(비트) | 최댓값 | 최솟값 |
| byte | 8bit | 127 | -128 |
| short | 16bit | 32,767 | -32,768 |
| int | 32bit | 2,147,483,647 | 2,147,483,648 |
| long | 64bit | 2⁶³-1 | -2⁶³ |
🎯 정리 🎯
자바는 모든 정수형 타입에서 음수를 표현할 때 2의 보수를 사용한다.
이로 인해 덧셈/뺄셈 연산이 통합되고, 하드웨어와 호환되며, 코드의 복잡성이 낮아진다!!
'JAVA > JAVA 실행 원리' 카테고리의 다른 글
| String (1) | 2025.04.30 |
|---|---|
| Semantic Error와 Syntax Error (0) | 2025.04.23 |
| JVM(자바 가상 머신) (0) | 2025.03.28 |
| 컴파일러(Compiler) (0) | 2025.03.28 |
| JAVA (0) | 2025.03.26 |