2의 보수 계산기
음수를 2의 보수로 바꾸는 과정을 단계별로 보여 주고, 2진수 비트열이 부호 있는 수로 얼마인지도 계산합니다.
2진수 칸은 입력한 자릿수를 비트 수로 봅니다. 1011은 4비트로 해석합니다.
2의 보수 만드는 법
음수 −n은 n을 2진수로 쓰고, 모든 비트를 뒤집은 다음 1을 더하면 됩니다. 이렇게 하면 뺄셈을 덧셈 회로로 할 수 있어서 CPU와 ALU가 이 방식을 씁니다. N비트로 표현할 수 있는 범위는 −2N−1부터 2N−1−1까지입니다.
풀이 예제: −5를 8비트 2의 보수로
- 절댓값 5를 8비트 2진수로: 0000 0101
- 모든 비트를 뒤집습니다: 1111 1010
- 1을 더합니다: 1111 1011 = 0xFB
- 확인: 1111 1011 + 0000 0101 = 1 0000 0000 → 넘친 자리를 버리면 0
4비트 2의 보수표
| 비트 패턴 | 부호 없는 수 | 2의 보수 |
|---|---|---|
| 0000 | 0 | 0 |
| 0001 | 1 | +1 |
| 0010 | 2 | +2 |
| 0011 | 3 | +3 |
| 0100 | 4 | +4 |
| 0101 | 5 | +5 |
| 0110 | 6 | +6 |
| 0111 | 7 | +7 |
| 1000 | 8 | −8 |
| 1001 | 9 | −7 |
| 1010 | 10 | −6 |
| 1011 | 11 | −5 |
| 1100 | 12 | −4 |
| 1101 | 13 | −3 |
| 1110 | 14 | −2 |
| 1111 | 15 | −1 |
비트 수별 표현 범위
| 비트 수 | 부호 있는 범위 | 부호 없는 범위 |
|---|---|---|
| 비트 수4 | 부호 있는 범위−8 ~ 7 | 부호 없는 범위0 ~ 15 |
| 비트 수8 | 부호 있는 범위−128 ~ 127 | 부호 없는 범위0 ~ 255 |
| 비트 수16 | 부호 있는 범위−32,768 ~ 32,767 | 부호 없는 범위0 ~ 65,535 |
| 비트 수32 | 부호 있는 범위−2,147,483,648 ~ 2,147,483,647 | 부호 없는 범위0 ~ 4,294,967,295 |
실전에서 쓰는 법
순서대로 쓰기
- 비트 수(4, 8, 16, 32비트)를 고릅니다. 같은 수도 비트 수마다 다르게 보입니다.
- 부호 있는 10진수를 넣거나, 해석할 2진수·16진수 패턴을 넣습니다.
- 표시된 단계를 따라갑니다. 크기의 비트를 뒤집고 1을 더합니다.
자주 하는 실수
- 범위를 벗어나기. n비트는 −2^(n−1)부터 2^(n−1) − 1까지 담습니다. 8비트는 −128에서 127이라서, +128은 부호 있는 바이트에 들어가지 않습니다.
- 비트를 늘릴 때 0으로 채우기. 음수를 더 많은 비트로 늘릴 때는 부호 비트를 복사합니다. −3은 4비트로 1101, 8비트로 0000 1101이 아니라 1111 1101입니다.
- 오버플로를 놓치기. 양수 둘을 더했는데 음수가 나오거나 음수 둘을 더했는데 양수가 나오면 오버플로입니다. 비트에 따로 경고가 보이지 않아도 그렇습니다.
컴퓨터가 2의 보수를 쓰는 이유
2의 보수를 쓰면 같은 가산기 회로로 부호 있는 수와 없는 수를 모두 처리하고, 뺄셈은 보수를 더하는 것으로 끝납니다. 부호-크기 표현과 달리 0도 하나뿐입니다. 대신 짝이 없는 값이 하나 있습니다. 가장 작은 음수(8비트에서 −128)는 양수 짝이 없어서, 부호를 바꾸면 자기 자신이 됩니다. 4비트 ALU 시뮬레이터에서 같은 덧셈의 캐리와 오버플로 플래그를 볼 수 있습니다.
계산 예: 부호 있는 센서 레지스터 읽기
온도 센서는 16비트 2의 보수 값을 돌려주는 경우가 많습니다. 레지스터가 0xFF38이라면 부호 없는 수로는 65,336입니다. 맨 위 비트가 1이므로 216 = 65,536을 빼면 −200입니다. 데이터시트에 한 단위가 0.0625 °C라고 되어 있다면 온도는 −200 × 0.0625 = −12.5 °C입니다.
폭이 달라도 규칙은 같습니다. 8비트 ADC 오프셋 레지스터가 0xC4라면 부호 없이 196이고, 196 − 256 = −60입니다. 흔한 버그는 이런 값을 부호 확장 없이 더 넓은 부호 없는 변수에 넣어서 −60을 +196으로 읽는 것입니다.
4비트로 보는 오버플로
- 4비트는 −8부터 7까지 담습니다. 0111은 7, 0001은 1, 0000은 0, 1111은 −1, 1000은 −8입니다.
- 5 + 4: 0101 + 0100 = 1001. 부호 없는 9로는 맞지만, 부호 있는 수로 1001은 −7입니다. 양수 둘을 더했는데 음수가 나왔으니 오버플로입니다.
- −3 + −2: 1101 + 1110 = 1 1011. 자리올림을 버리면 1011은 −5로 정답입니다. 여기서 맨 위 비트의 자리올림은 정상이며 오버플로가 아닙니다.
빠르게 판단하려면 부호를 보세요. 오버플로는 두 피연산자의 부호가 같을 때만 생기고, 결과의 부호가 반대로 나오는 것으로 드러납니다. 4비트 ALU 시뮬레이터가 같은 플래그를 계산해 줍니다.
자주 묻는 질문
8비트 2의 보수로 −1은 어떻게 되나요?
1111 1111(0xFF)입니다. 1을 0000 0001로 쓰고, 모든 비트를 뒤집어 1111 1110을 만든 뒤 1을 더합니다.
2의 보수에서 음수인지 어떻게 알 수 있나요?
맨 앞 비트를 보면 됩니다. 1이면 음수이고, 값은 부호 없는 값에서 2의 비트 수 제곱을 뺀 것입니다.