[無에서 시작하는 컴퓨터&과학]

[컴퓨터][15] 산술/논리 연산 회로 - 3 (뺄셈 회로와 2의 보수)

core-basic 2024. 9. 2. 23:41
728x90

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.


이전 글을 통해서

컴퓨터는 초기에 산술/논리 연산 등 수학적 계산을

자동화하고자 설계되었음에 따라, 기본적인 산술 연산 중

덧셈 회로를 구현하고자 했다.

그래서 반가산기와 전가산기라는 덧셈 회로를 구현해 보았다.

 

[컴퓨터][14] 산술/논리 연산 회로 - 2 (덧셈 회로 : 전가산기, 8bit 전가산기)

※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.이전 글을 통해서컴퓨터는 초기에 산술/논리 연산 등 수학적 계산을 자동화하고자 설계되었고,이에 따라 산술/논

core-basic.tistory.com

그러면 덧셈 회로에 이어서

산술 연산 회로 중 뺄셈 연산 회로에 대해 알아보겠다.

< 산술/논리 연산 회로 (3) >
(뺄셈 회로와 2의 보수)


< 이진수의 뺄셈 >

결론부터 말하면 이진수의 뺄셈 과정은 십진수의 뺄셈 과정과 다르다.

이진수의 뺄셈 과정에서 연산자는 무조건 덧셈만을 이용한다.

그 대신 피연산자를 양수뿐만 아니라 음수도 가능하게 한다.

십진수로 예를 들면, 21 - 15 = 21 +(-15)와 같이 피연산자를 음수로 변환한다.

따라서 이진수의 뺄셈 연산 과정의 핵심은

"음수를 이진수로 어떻게 표현할 것인가?"

라는 질문의 해결 과정과도 같다.


< 음수를 이진수로 표현하는 방법 >

음수를 이진수를 표현하는 방법은

주어진 비트 수에 따라 표현할 수 있는 숫자 범위를 파악한 후

해당 숫자 범위를 음수영역과 양수 영역으로 나눈다

예를 들어 산술 연산 회로에 8bit 입력이 주어졌을 경우

입력 가능한 값은 십진수로 0 ~ 2⁸-1 (255)까지의 범위를 가진다.

이때, 해당 범위를 반으로 나누어,

0~127까지는 0을 포함한 양수로 약속하고,

128~255까지는 음수로 약속하면

0을 포함한 양수는 0 ~ 127,  음수는 -1 ~ -128까지 표현이 가능하다.

 

위와 같은 방식으로 3bit (0~7)에 대해서 표로 나타내면 다음과 같다.

십진수 0 1 2 3 4 5 6 7
이진수 0 1 10 11 100 101 110 111
십진수
[음수 포함]
0 1 2 3 -4 -3 -2 -1
이진수
[음수 포함]
0 1 10 11 100 101 101 111

< 2의 보수 >

따라서 만약 뺄셈 회로에서 입출력 비트로 8bit가 주어지고,

0001 0101 (21)  -  0000 1111 (15) = 0000 0110 (6) 연산을 진행한다면

뺄셈 회로는 0000 1111 (15)를 1111 0001 (-15)로 변환해 준 후

덧셈을 진행해야 한다.

 

즉, 주어진 이진수를 음수로 변경해야 하는데,

이때 2의 보수라는 수학적인 방법에 적용된다.

 

보수란 더해서 특정 값을 만드는 것으로,

2의 보수는 주어진 이진수에 대해서,

주어진 자릿수를 넘어선 2의 거듭제곱이 되려면

어떤 수를 더해야 하는지 구하는 것이다.

 

위의 예시를 이용해 더 자세히 살펴보면

0001 0101 (21)  -  0000 1111 (15) = 0000 0110 (6) 연산에서

0000 1111 (15)에 1111 0001 (241)을 더해 주면

1 0000 0000 = 256 = 2⁸  , 9bit를 차지하는 2의 거듭제곱이 된다.

따라서 1111 0001(241)이 0000 1111의 2의 보수가 된다.

그런데 실질적으로는 입출력 범위가 8bit로 제한되어 있기 때문에

0000 0000 이 출력된다.

즉, 15 + 241 = 0이 되는 꼴이다. 결국 241 = -15와 같은 기능을 하게 된다.

따라서 만약 8bit : 0000 0000에 +1씩 계속 더해주면

다음과 순서대로 계속 순환하는 특징을 가지게 된다.

0, 1, 2, 3, 4, 5... 127, -128, -127, -126... - 3, -2, -1


< 2의 보수를 쉽게 구하는 방법 >

어떤 이진수의 2의 보수를 수학적으로 쉽게 구하는 방법은

해당 이진수의 1의 보수를 구한 후 +1을 해주는 것이다.

1의 거듭제곱은 아무리 해도 1이므로,

해당 이진수에 1이 되려면 어떤 수를 더해야 하는지 그 값을 구한 후

+1을 해주면 된다.

그러면 다시 이진수의 1의 보수는 어떻게 구하는지가 문제인데,

이는 역수, 즉 1을 0으로, 0을 1로 변환해 주면 된다.

ex) 15 → -15

- 0 - 
15 = 0000 1111

- 1 -
1의 보수 = 1111 0000

- 2 -
2의 보수 = 1111 0000 + 1 = 1111 0001 = -15


< 뺄셈 과정 >

따라서 위의 과정을 토대로 2bit 뺄셈 과정을 표로 살펴보면 다음과 같다.

 A B B의 1의 보수 B의 2의 보수 A + B의 2의 보수
00 00 00 → 11 11 + 1 = 100 00
01 00 00 → 11 11 + 1 = 100 01
10 00 00 → 11 11 + 1 = 100 10
11 00 00 → 11 11 + 1 = 100 11
 A B B의 1의 보수 B의 2의 보수 A + B의 2의 보수
00 01 01 → 10 10 + 1 = 11 11
01 01 01 → 10 10 + 1 = 11 100
10 01 01 → 10 10 + 1 = 11 101
11 01 01 → 10 10 + 1 = 11 110
 A B B의 1의 보수 B의 2의 보수 A + B의 2의 보수
00 10 10 → 01 01 + 1 = 10 10
01 10 10 → 01 01 + 1 = 10 11
10 10 10 → 01 01 + 1 = 10 100
11 10 10 → 01 01 + 1 = 10 101
 A B B의 1의 보수 B의 2의 보수 A + B의 2의 보수
00 11 11 → 00 00 + 1 = 1 01
01 11 11 → 00 00 + 1 = 1 10
10 11 11 → 00 00 + 1 = 1 11
11 11 11 → 00 00 + 1 = 1 100

그리고 주어진 표를 논리게이트와 가산기에 비교하면

B의 1의 보수 결과는 B에 대해서 NOT 게이트와 같다. 또는 B XOR 1과 같다.

B의 2의 보수 결과는 B의 1의 보수에 대해서 가산기를 통해 +1 한 결과와 같다.

A + B의 2의 보수의 결과는 A, -B에 대해서 가산기를 통해 더한 것과 같다.
"A + (-B)"

 

이때 B의 2의 보수를 구하기 위해 +1을 해주어야 하므로, A, B 이외에

1을 입력할 1bit 입력값이 하나 더 필요하다.

즉, 뺄셈 회로는 3개의 입력비트(A, B,1)가 필요하다.

그런데 뺄셈 과정 중에 덧셈 회로인 전가산기가 필요하고,

전가산기는 3bit 입력 비트를 가진다.

그리고 그중 자리올림 입력 비트(CI)는 뺄셈 과정에서 필요 없다.

따라서, CI의 입력값으로 1을 고정시키면  2의 보수를 구하는 데 사용할 수 있다.

심지어, B XOR 1을 통해 1의 보수를 구하는데도 사용될 수 있다.

 

따라서 위의 과정을 논리 게이트와 가산기에 대응시키면 다음과 같다.

 A B B XOR CI(1)
(NOT B)
B의 1의 보수
ADD( B XOR CI(1), CI(1) )

B의 2의 보수
ADD ( A, -B)

A + B의 2의 보수
00 00 00 → 11 11 + 1 = 100 00
01 00 00 → 11 11 + 1 = 100 01
10 00 00 → 11 11 + 1 = 100 10
11 00 00 → 11 11 + 1 = 100 11
 A B B XOR CI(1)
(NOT B)
B의 1의 보수
ADD( B XOR CI(1), CI(1) )

B의 2의 보수
ADD ( A, -B)

A + B의 2의 보수
00 01 01 → 10 10 + 1 = 11 11
01 01 01 → 10 10 + 1 = 11 100
10 01 01 → 10 10 + 1 = 11 101
11 01 01 → 10 10 + 1 = 11 110
 A B B의 1의 보수 ADD( B XOR CI(1), CI(1) )

B의 2의 보수
ADD ( A, -B)

A + B의 2의 보수
00 10 10 → 01 01 + 1 = 10 10
01 10 10 → 01 01 + 1 = 10 11
10 10 10 → 01 01 + 1 = 10 100
11 10 10 → 01 01 + 1 = 10 101
 A B B XOR CI(1)
(NOT B)
B의 1의 보수
ADD( B XOR CI(1), CI(1) )

B의 2의 보수
ADD ( A, -B)

A + B의 2의 보수
00 11 11 → 00 00 + 1 = 1 01
01 11 11 → 00 00 + 1 = 1 10
10 11 11 → 00 00 + 1 = 1 11
11 11 11 → 00 00 + 1 = 1 100

따라서

이진수 뺄셈 과정을 논리 게이트와 덧셈 회로를 통해 표현할 수 있으므로,

뺄셈 회로를 구현할 수 있다.


< 뺄셈 회로 >

입출력이 8bit인 8x8 뺄셈 회로는 다음과 같으며,

예시로, 0001 0101(21) - 0000 1111(15) = 0000 0110(6)

계산을 확인할 수 있다.

그리고 만약 CI (1bit)가 0으로 설정할 경우,

해당 회로는 8x8 덧셈 회로 즉, 8x8 전가산기와 같은 기능을 할 수 있다.


< 뺄셈 회로와 덧셈 회로 >

뺄셈 회로의 중요한 핵심은 결국

논리 게이트와 덧셈회로(가산기)만 있으면 된다는 것이다.

즉, 가산기와 같이 뺄셈만을 위한 별도의 장치를 제작할 필요가 없다.

따라서 앞으로 탐구할 기본적인 산술/논리 연산 중에서도

이미 구현한 논리 게이트와 가산기만으로 구현될 수 있거나,

새로운 장치가 필요할 수 있다.

 

 

이번 글은 요기서 마치며,

다음 글은 산술 연산 회로 중 곱셈 회로에 대해 알아보면서

궁극저긍로 산술/논리 연산회로에 어떤 회로가 필요한지 탐구해 보겠다.


※ 해당 게시글은 주제를 탐구하면서 주관적인 생각을 정리 한 글입니다.

728x90