2의 보수 계산 쉽게 이해하기 — 개념과 원리
2의 보수는 오늘날 거의 모든 컴퓨터가 부호 있는 정수를 저장하는 방식입니다. 이 계산기는 10진 정수를 8, 16, 32비트의 2의 보수로 나타낸 비트 패턴과 16진수, 그리고 그 비트 수로 표현할 수 있는 범위를 보여 줍니다. 프로그래밍, 이진 데이터 디버깅, 메모리 덤프 해석, 컴퓨터 구조 공부에 유용합니다.
계산 방법
- 0 ≤ n ≤ 2^(b−1) − 1이면 n을 2진수로 쓰고 앞을 0으로 채워 b비트로 만듭니다.
- n이 음수이면 2^b + n을 2진수로 쓴 것이 저장되는 패턴입니다.
- 16진수는 비트를 네 개씩 묶어 b/4자리로 나타냅니다.
- b비트 부호 있는 정수의 범위는 −2^(b−1)부터 2^(b−1) − 1까지입니다.
손으로 구할 때는 |n|을 2진수로 쓰고 모든 비트를 뒤집은 뒤 1을 더하면 같은 결과가 나옵니다. 범위를 벗어나면 "out of range"로 표시됩니다.
원리
b비트 레지스터는 2^b를 법으로 하는 계산을 합니다. 모든 비트가 1인 값 다음은 다시 0이 됩니다. 이 체계에서는 2^b를 더해도 값이 변하지 않으므로 2^b + n은 n과 똑같이 동작합니다. 그래서 −42를 256 − 42로 저장하면 부호 없는 덧셈을 그대로 해도 올바른 결과가 나옵니다. 42 + (256 − 42) = 256은 넘쳐서 0이 됩니다. 덕분에 하드웨어에 뺄셈 회로를 따로 둘 필요가 없고 0의 표현도 하나뿐입니다. 맨 왼쪽 비트는 −2^(b−1)의 자리값을 가지므로 음수일 때 항상 1이 되어 부호 비트 역할을 합니다.
예제 풀이
- 입력값: 10진수 −42, 8비트입니다.
- −128 ≤ −42 ≤ 127이므로 범위 안에 있습니다.
- 2⁸ + (−42) = 256 − 42 = 214입니다.
- 214를 2진수로 쓰면 11010110입니다.
- 검산: 42 = 00101010을 뒤집으면 11010101, 1을 더하면 11010110입니다.
- 1101 = D, 0110 = 6이므로 16진수는 D6이고, 범위는 −128 … 127입니다.
결과 해석
맨 앞 비트가 1이면 음수입니다. 음수 패턴을 해석하려면 부호 없는 수로 읽은 뒤 2^b를 빼면 됩니다. 214 − 256 = −42입니다. 같은 −42를 16비트로 나타내면 부호 비트가 새로 생긴 윗자리에 복사되어 FFD6이 되며, 이를 부호 확장이라고 합니다. 범위는 비대칭이어서 음수가 양수보다 하나 많으므로, 8비트에서 −128에 대응하는 +128은 없습니다.
흔한 실수
- 비트를 뒤집기만 하고 1을 더하지 않습니다. 이는 1의 보수입니다.
- 음수 패턴을 부호 없는 수로 읽어 −42를 214로 해석합니다.
- 비트 수를 늘릴 때 음수의 앞을 1이 아니라 0으로 채웁니다.
- 오버플로를 무시합니다. 8비트에서 127 + 1은 −128이 됩니다.
자주 묻는 질문
부호 비트와 절댓값으로 나타내면 안 되나요?
그 방식은 +0과 −0 두 개의 0이 생기고 덧셈에 별도 처리가 필요합니다. 2의 보수는 이 문제가 없습니다.
가장 작은 음수의 2의 보수는 무엇인가요?
자기 자신입니다. 8비트에서 −(−128)은 표현할 수 없어 다시 −128이 됩니다.
실수(부동소수점)에도 2의 보수를 쓰나요?
아닙니다. IEEE 754 부동소수점은 별도의 부호 비트와 지수부, 가수부를 씁니다.
출처: D. A. Patterson and J. L. Hennessy, Computer Organization and Design, Chapter 2(부호 있는 수와 부호 없는 수) · D. E. Knuth, The Art of Computer Programming, Vol. 2: Seminumerical Algorithms, 4.1절