-
컴퓨터에서의 뺄셈 구현 - 보수(complement)를 활용한 감산의 가산 처리CS기초/OS,HW 2023. 3. 29. 20:09728x90반응형
컴퓨터에서 곱셈은 덧셈, 뺄셈과 나눗셈은 보수의 덧셈을 활용하여 동작한다. 따라서 컴퓨터는 사칙연산 중 덧셈밖에 하지 못한다.
일단, 곱셈의 경우 덧셈으로 간단하게 구현이 가능한데, 해당 연산을 위한 회로를 따로 설계하는 것은 비효율적이기 때문이다. 나눗셈 역시 피제수(나누어지는 수)에서 제수(나누는 수)를 제수보다 적어질 때까지 계속 뺀 후 뺄셈의 횟수를 세면 되기 때문에 뺄셈을 구현하면 따로 회로를 설계할 필요가 없다.
(예 - 7/2 → 2보다 작아질 때까지 7에서 2를 빼서 뺀 횟수를 구함 → 3, 나머지 1)
그렇다면 뺄셈은 왜 보수의 덧셈으로 구현할까?
뺄셈은 정확히 말하면 양수와 음수, 또는 음수끼리의 덧셈이다. 덧셈은 교환법칙이 성립하지만 뺄셈은 성립하지 않으므로, 앞 뒷 값의 절대값 크기 비교가 필요한데, 이 모든 경우에 대해 회로를 설계하는 것보다 보수의 덧셈으로 구현하는 것이 간단하기 때문이다.
보수란?
보수는 완전한 수가 되기 위해 필요한 수이다 (사실 수학적으로 정확한 표현은 아니다. 정확한 표현을 위해서는 다른 문서를 찾아보기를 권장한다)
뺄셈을 설명하기 위해 r의 보수, r-1의 보수 두 가지를 알아야한다.
n자리인 r진수 N에 대한 r의 보수
n자리인 r진수 숫자 N에 대한 r의 보수는 다음과 같이 구할 수 있다.
- N = 0 일때 0
- N != 0 일때 $ r^{n}-N $
예를 들어, 10진수 2에 대한 10의 보수는 2는 한 자리이므로 $$ 10^{1}-2=8 $$
10진수 35.34에 대한 10의 보수는 $$10^{2}-35.34=64.44$$
2진수 110111에 대한 2의 보수는 $$ 2^{6}-110111=1000000-110111=1001 $$
n자리인 r진수 N에 대한 r-1의 보수
r-1의 보수는 0초과의 수에 대해 고려한다.
- 소숫점 아래 자리수를 m이라고 했을 때, $ r^{n}-r^{-m}-N $
예를 들어, 10진수 2에 대한 9(10-1)의 보수는 $$10^{1}-10^{-0}-2=10-1-2=7$$
10진수 35.34에 대한 9의 보수는 $$10^{2}-10^{-2}-=100-0.01-35.34=64.65$$
2진수 1101.11에 대한 1의 보수는 $$2^{4}-2^{-2}-1101.11=10000-0.01-1101.11=10$$
여기에서 r의 보수와 r-1의 보수의 관계를 도출할 수 있다.
r의 보수 = (r-1)의 보수 + 가장 낮은 자리에 하나를 더함
r의 보수와 (r-1)의 보수의 차이인 $ r^{-m} $이 가장 낮은 자리가 1인 수이기 때문
또한, 2진수의 1의 보수는 0을 1로, 1을 0으로 바꿈으로써 구할 수 있다. 위의 예에서, 1101.11의 0을 1로, 1을 0으로 바꾸면 0010.00으로, 식으로 구한 10과 같은 값이 나온다.
따라서 위에서 인용한 식과 결합하면 2진수의 1의 보수를 구한 후, 가장 낮은 자리에 하나를 더하는 방식으로 2진수의 2의 보수를 쉽게 구할 수 있다. 이를 이용해 컴퓨터에서는 감산을 가산으로 처리한다.
보수를 이용해 감산을 가산으로 처리
보수를 이용해 감산을 가산으로 처리하는 논리적 식은 다음과 같다.
$$ (\pm x)- (\pm y) = (\pm x) + (\mp y) $$
즉, 923-678을 할 경우,
- 678에 대한 10의 보수를 더해주고 다시 1000을 빼준다.
- 678의 10의 보수는 678과 더해서 1000을 만들어주는 수 이므로, 923+(1000-678)-1000과 같은 식이 된다. 간단하게 맨 앞자리를 빼주면 된다.
10진수로 생각하면 이 과정을 왜 하나 싶지만, 컴퓨터는 2진수로 수를 계산하고, 앞서 얘기했듯 2진수는 2에대한 보수를 가감산 없이 간단하게 구할 수 있으므로 뺄셈을 직접 수행하는 것 보다 빠르게 수행할 수 있다.
1011-101을 수행한다고 할 때, 다음과 같은 과정을 거친다.
- 10과 1을 뒤집어서 101에 대한 1의 보수를 구한다. 이 때 앞의 수와 자릿수를 맞춰줘야하므로 1010이 된다.
- 가장 낮은 자리에 1을 더해 2의 보수를 구한다 = 1011
- 앞의 수인 1011과 뒷 수에 대한 2의 보수인 1011을 더한다 = 10110
- 보수를 구하기 위해 더했던 10000 뺀다 = 110 (최종 결과값)
이는 실제 감산을 수행한 결과값과 같고, 뺄셈을 위한 별도의 회로를 구성할 필요가 없으므로 효율성을 위해 컴퓨터에서는 덧셈으로 가감승제를 모두 처리한다.
728x90반응형'CS기초 > OS,HW' 카테고리의 다른 글
도커를 공부하다보면 마주치게 되는 가상화란, 가상화의 종류 (0) 2022.12.18 운영체제 7: 코드를 통한 프로세스 작동 방식의 이해 (0) 2022.05.30 운영체제 6: 프로세스 간 커뮤니케이션 - 가상 메모리와 IPC에 대해 (0) 2021.12.30 운영체제 5: 컨텍스트 스위칭 (Context Switching) (0) 2021.12.28 운영체제 4: 프로세스 (Process)의 구조 (0) 2021.12.28