컴퓨터는 뺄셈을 어떻게 덧셈으로 바꿀까? — 보수와 모듈러 원리
컴퓨터는 뺄셈을 어떻게 덧셈으로 바꿀까? — 보수와 모듈러 원리
2의 보수를 처음 배울 때 보통 이렇게 외운다.
비트를 뒤집고 1을 더하면 음수가 된다.
틀린 말은 아니다. 하지만 이 문장만 외우면 원리가 잘 안 잡힌다. 왜 뒤집는지, 왜 1을 더하는지, 왜 그게 음수처럼 작동하는지 빠져 있기 때문이다.
핵심은 2진수 자체가 아니다. 먼저 봐야 할 것은 정해진 자릿수 안에서 숫자가 한 바퀴 돈다는 사실이다.
1. 먼저 자릿수의 크기를 정해야 한다
컴퓨터는 무한히 큰 정수를 항상 들고 다니지 않는다. 예를 들어 4비트 정수라면 사용할 수 있는 칸은 딱 4개다.
0000부터 1111까지
총 16개
4비트에서는 표현 가능한 패턴이 16개다.
가장 큰 값인 1111에 1을 더하면 수학적으로는 10000이 된다.
하지만 4비트 공간에는 5번째 칸이 없다.
그래서 앞의 1은 버려지고 다시 0000이 된다.
즉 4비트 세계는 0부터 15까지 갔다가 다시 0으로 돌아오는 구조다.
수학적으로 말하면 mod 16 세계다.
일반화하면 이렇다.
한 바퀴 크기 M = N^m
최대수 = M - 1
2진수 4자리라면 M = 2^4 = 16이고,
최대수는 15 = 1111₂이다.
2. 뺄셈은 뒤로 가는 것이다
이제 3 - 5를 생각해보자.
보통은 3에서 5를 빼니까 결과는 -2다.
그런데 4비트 세계는 16칸짜리 원처럼 돈다. 이 세계에서는 뒤로 5칸 가는 것과 앞으로 11칸 가는 것이 같은 위치에 도착한다.
왜냐하면 16 - 5 = 11 이기 때문이다.
그래서 컴퓨터는 3 - 5를 이렇게 바꿀 수 있다.
= 3 + (16 - 5)
= 3 + 11
= 14
여기서 14가 왜 -2냐고 물을 수 있다.
16칸짜리 세계에서 14는 0보다 두 칸 뒤에 있는 위치다.
그래서 signed two's complement 방식으로 해석하면 14는 -2가 된다.
같은 위치에 도착한다. 그래서 뺄셈을 보수의 덧셈으로 바꿀 수 있다.
```3. 보수는 “한 바퀴를 채우는 수”다
어떤 수 B를 빼고 싶다면, B를 직접 빼는 대신 B의 보수를 더한다. 여기서 보수는 B와 더했을 때 한 바퀴를 채우는 수다.
4비트에서 한 바퀴는 16이다. 5를 빼고 싶다면 5의 보수는 다음과 같다.
11 = 1011₂
그래서 4비트에서 -5를 표현하는 비트패턴은 1011이다.
이 말은 1011 자체가 무조건 -5라는 뜻이 아니다.
같은 비트패턴도 해석 방식에 따라 값이 달라진다.
| 비트패턴 | unsigned 해석 | 4비트 signed two's complement 해석 |
|---|---|---|
1011 |
11 | -5 |
중요한 것은 비트패턴과 해석을 구분하는 것이다.
1011은 그냥 네 자리 비트패턴이다.
이것을 unsigned로 읽으면 11이고, signed two's complement로 읽기로 약속하면 -5다.
4. 왜 “뒤집고 +1”인가
이제 보수 공식으로 돌아가보자.
그런데 M - B를 바로 계산하려면 한 자리 더 큰 수에서 빼야 한다.
4비트라면 10000₂ - B를 해야 한다.
대신 이 식을 이렇게 바꾼다.
= ((M - 1) - B) + 1
여기서 M - 1은 그 자릿수에서의 최대수다.
4비트 이진수에서는 1111₂이다.
5의 2의 보수를 구해보자.
M - 1 = 15 = 1111₂
``` (M - 1) - B
= 1111₂ - 0101₂
= 1010₂
마지막에 +1
1010₂ + 1 = 1011₂ ```
여기서 1111₂ - 0101₂ = 1010₂가 바로 “비트 뒤집기”다.
왜냐하면 이진수에서는 각 자리의 최대 숫자가 1이기 때문이다.
| 원래 자리 | 1에서 뺀 결과 |
|---|---|
| 0 | 1 |
| 1 | 0 |
그래서 이진수에서는 (M - 1) - B가 그냥 0↔1 반전처럼 보인다.
그리고 마지막에 1을 더하면 2의 보수가 된다.
= 비트 반전 + 1
= ((M - 1) - B) + 1
= M - B
5. 이진수만의 원리는 아니다
보수의 원리는 이진수 전용이 아니다. N진수 m자리라면 똑같이 적용된다.
예를 들어 5진수 2자리에서 생각해보자.
M = 5² = 25 = 100₅
최대수 M - 1 = 24₁₀ = 44₅
이제 21₅의 5의 보수를 구해보자.
최대수 = 44₅
``` 44₅ - 21₅ = 23₅
23₅ + 1 = 24₅ ```
따라서 21₅의 5의 보수는 24₅다.
확인해보면 둘을 더했을 때 정확히 한 바퀴가 된다.
이진수에서만 “뒤집고 +1”처럼 보였던 것이다. 일반적인 표현은 다음이 더 정확하다.
N진수의 보수 만들기
1. 각 자리를 N - 1에서 뺀다.
2. 마지막에 1을 더한다.
5진수에서는 각 자리의 최대 숫자가 4이므로 다음처럼 바뀐다.
| 원래 자리 | 4에서 뺀 결과 |
|---|---|
| 0 | 4 |
| 1 | 3 |
| 2 | 2 |
| 3 | 1 |
| 4 | 0 |
2진수에서는 이 표가 너무 단순해진다. 가능한 숫자가 0과 1뿐이라서 그냥 뒤집기처럼 보인다.
6. 정리
보수는 외워야 하는 꼼수가 아니다. 자릿수가 정해진 숫자 세계에서 뺄셈을 덧셈으로 바꾸는 방법이다.
= A + (M - B) mod M
여기서 M은 한 바퀴 크기다.
N진수 m자리라면 M = N^m이다.
그리고 M - B를 쉽게 구하기 위해 식을 이렇게 바꾼다.
= ((M - 1) - B) + 1
M - 1은 그 자릿수의 최대수다.
이진수에서는 최대수가 111...111이므로,
(M - 1) - B가 비트 반전이 된다.
그래서 우리가 외우던 말이 나온다.
2의 보수 = 비트 뒤집고 +1
하지만 이 문장은 결론이다. 원리는 이쪽이 더 정확하다.
정해진 자릿수에서는 숫자가 한 바퀴 돈다.
뺄셈은 반대 방향 이동이다.
반대 방향으로 B만큼 가는 것은 앞으로 M - B만큼 가는 것과 같다.
그래서 B를 빼는 대신 B의 보수를 더한다.
'공학' 카테고리의 다른 글
| 차가운 미니선풍기 - 펠티에 소자 (0) | 2025.09.07 |
|---|---|
| 부분분수 분해 원리 (5) | 2025.01.13 |
| 라플라스 변환은 왜 고차항일수록 변환결과가 작아질까? (3) | 2025.01.12 |
| SR플립플롭에서 S=1, R=1이면 어떻게 될까? (2) | 2024.04.05 |
