CS/Computer Architecture

[컴퓨터구조] 3-1. Complements

F12:) 2023. 9. 13. 01:29

1, 2장은 교수님께서 논리회로 때 설명한거라고 하고 넘어가주셨다. 난 안들었는데.. 강의자료라도 첨부해주시지 첨부도 안해주셨다. 그러고 우리보고 알아서 1, 2장을 공부하란다 ㅠㅠ 그래서 3장부터 시작합니다!!

 


 

컴퓨터는 2진수를 사용한다. 또한 컴퓨터에는 add 즉, 더하기 기능만 존재한다. 그런데 어떻게 컴퓨터는 사칙연산을 모두 진행할 수 있을까??

 

우리는 보수의 개념에 대해서 배우고, 컴퓨터 내에서 뺄셈은 어떻게 진행되는 지 알아본다. 또한 이러한 연산에서 발생하는 overflow Error에 대해서 다룬다.

 

 

Complements

앞서 말했듯이 컴퓨터는 0과 1로 이루어진 세계이다. 우리는 기본적으로, 10진법 수를 2진수로 나타낼 수 있다. 만약 우리에게 10+2의 이진수 결과를 나타내라고 한다면, 10+2=12를 이진수로 나타낼 것이다. 하지만 컴퓨터는 이러한 10진수를 사용할 수 없다. 따라서 이진수 내에서도 사칙연산 과정들이 필요하였다.

 

우선은 이진수의 세계에서도 더하기 or 빼기라는 개념이 존재해야한다. 그래서 우리는 보수(Complement)라는 개념을 도입하였다. 우리가 사용하는 보수에는 크게 1의 보수2의 보수가 있다.

 

1의 보수는 해당 수의 각 비트에 1을 더해주는 것이다. 만약 최상위 비트에 carry가 존재한다면 무시하다.

가령, 우리가 110이라는 이진수의 1의 보수를 구한다면(보통 통용되지는 않지만, 맨 앞자리가 sign 즉, 부호를 나타낸다고 가정해보자) 001이 되는 것이다.

 

또한 110이라는 수의 2의 보수를 구하면, 1차 보수를 구한 뒤 최하위 비트에 1을 더하면 된다.

110의 2의 보수 : 110 -> 001 -> 001 + 1 ->010이다. 이렇게 되면 2의 보수 즉 010은 110의 음수를 나타낸다.

 

앞서 sign magnitude 즉, 최상위 비트를 부호로 표현하는 것은 통용되지 않는다고 언급하였다. 이유는 0이 두 개 존재하기 때문이다. 100과 000은 +0, -0을 나타내므로 절대적인 0이 두개가 되는 것이 혼란을 야기할 수 있기 때문이다. 따라서 이후 언급하는 모든 것들은 sign magnitude를 사용하지 않는다.

 

 

이번 장에서는 덧셈과 뺄셈만 다루도록 하자.

 

1. 덧셈

컴퓨터에서 두 수의 덧셈은 단순하게 우리가 아는 덧셈 방법과 거의 유사하다. 우리가 3비트 컴퓨터(3비트의 수의 범위는 -4 ≤ N ≤3)를 가지고 1 + 2를 진행한다고 해보자. 우선 1+2 = 001 + 010이다. 이제 우리는 우리가 평소 아는 덧셈과 같은 작업을 해준다.

 

결과는 011이다. 011은 10진수로 3이므로 해당 연산이 올바르게 실행되었음을 알 수 있다.

 

2. 뺄셈

컴퓨터에서는 덧셈만을 갖고 있는다. 그렇다면 뺄셈은 어떻게 계산할까?? 조금만 생각해보면 간단하다. 우리는 앞서 보수(Complement)를 다루면서 음수의 개념을 설명했다. 이 방식을 이용한다.

 

우리가 3-4를 한다면 컴퓨터는 3 + (-4)로 인식하게 된다. 따라서 3을 표현하고 4를 2의 보수 방법을 이용하여 -4를 구한 후 이를 더해준다.

 

4비트 컴퓨터가 있다고 하자. 직관적이고 쉬운 설명을 위해 여기서도 sign magnitude를 예로 든다.

3 = 0011

4 = 0100

-4 = 1100

 

따라서 3 + (-4) = 1111이므로, -1이된다. (sign magnitude를 사용하면 1111은 -1이다)

 

 

3. Overflow Error

4비트 컴퓨터(수의 범위 -8 ≤ N ≤7)가 있다고 해보자.

 

우리는 -3-6을 진행하려고 한다.

 

3 = 0011,    -3 = 1101

6 = 0110,    -6 = 1010

 

이 된다.

 

이제 더해보자.

 

-3 + (-6) = 0111이다. 0111은 7을 나타낸다. 

 

어라? -3 -6 = -9인데 왜 7을 나타낼까?? 여기서 Overflow Error가 발생한다.

 

우리는 앞서 sign magnitude를 이용한 4비트 컴퓨터의 수의 범위를 알았다. 하지만 우리가 원하는 결과값은 수의 범위를 넘게 되므로 이 컴퓨터는 값을 표현할 수 없게 된다. 이러한 오류를 Overflow Error라고 한다.

 

그렇다면 컴퓨터에서는 이러한 연산이 잘못된 것임을 인지하고 오류를 표현하는 등의 작업을 해줘야한다. 그렇다면 컴퓨터는 이 값이 잘못되었는지를 어떻게 알 수 있을까??

 

바로, 앞에서부터 두 개의 carry 값을 비교하면 된다. 앞서 carry라는 용어를 언급한 적이 있다. 쉽게 말하면 올림 수라고 생각하자. 우리가 세로식으로 덧셈을 수행할 때, 올림 수라는 개념이 존재하는 것처럼 말이다.

 

 

실제로 -3-6을 실행하는 과정에서 최상위 비트의 carry는 1+1이므로 1이 된다.(carry가 1이 되므로 sum은 0이 된다.) 그리고 최상위 비트 바로 뒤의 carry는 1+0이므로 0이 된다. (당연하게 sum은 0이다.)

 

이러한 경우에 가장 앞의 두 개의 carry가 다르므로, 컴퓨터에서는 overflow error가 발생했음을 미리 인지할 수 있고, 예방할 수 있게 된다. 다른 예를 들어 비교해보면 알겠지만, carry가 같을 때는 overflow error가 발생하지 않는다.