본문 바로가기

IT/기타

[기초CS] 컴퓨터는 사칙연산을 어떻게 할까?

0) 들어가기 전에 

기본적으로 컴퓨터는 2진법을 사용한다.

 

문자의 경우도 ASCII 라는 코드 체계를 통해 숫자를 문자로 변환하여(렌더링) 표현한다. 

이런 과정으로 숫자 1, 문자 '1'  같은 개념이 생긴다. 숫자 1은 0x01 이고 문자 0x31 이다.

(0x 는 16진법을 사용하였음을 알려주는 접두어) 

 

1) 1 + 2 

2) '1' + 2

 

1의 경우에는 숫자 1과 2를 더하여 결과가 3이고 

2는 문자 1과 숫자 2를 더하여 숫자 2가 형변환이 일어난다. 따라서 결과값은 문자 '12' 가 된다. 

 

1) 더하기

본격적으로 계산에 들어가기 전에 이진법 더하기를 논리회로로 표현해보자. 

A B S C
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0

C는 Carry 자리 올림, S는 Sum 합을 의미한다.

A, B, S 컬럼을 보면 AND

A, B, C 컬럼을 보면 XOR 이다. 

 

기호로 표현하면 이렇게 표현할 수 있다. 

이를 반가산기라고 한다.

 

'반' 가산기인 이유는 INPUT 이 A, B 두 개 뿐이라 자리수 올림 계산이 불가하기 때문이다. 

 

 

 

 

가산기 경우의 수 

X Y Z C S
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

S = ~X~YZ + ~XY~Z + X~Y~Z + XYZ

   = ~X(~YZ + Y~Z) + X(~Y~Z + YZ)

   = ~X(Y⊕Z) + X~(Y⊕Z)

  (Y⊕Z) 를 K로 치환하면 

   =  ~XK + X~K

   = X⊕K

   = XY⊕Z

 

C = ~XYZ + X~YZ + XY~Z + XYZ

   = Z(~XY + X~Y) + XY(~Z + Z)

   ~Z + Z = 1 이므로

   = Z(X⊕Y) + XY

   

=> 가산기는 두 개의 반 가산기와 하나의  OR 게이트의 조합이다. 

 

출처: 

https://www.youtube.com/watch?v=F3vyljV4soo

2) 빼기 

컴퓨터는 빼기도 더하기로 처리한다. 

보수(Complement)를 찾아서 더하여 뺄셈 연산을 한다. 

 

6 + 4 = 10 

=> 4 는 6에 대한 10의 보수이다. 

 

13 - 6 = 7 

=> 7은 13에 대한 -6의 보수이다. 

     지금 이것만 보면 쉽게 쉽게 이해가 되는데 1의 보수 2의 보수랑 같이 보니까 

     뇌정지가 오기 시작해서 아래의 영상을 찾아보았다. 

 

     쉽게 생각하면 우리는 지금 10진수를 사용하여 계산을 하고 있다. 

     무슨 수던간에 1자리 수라면 10을 더했을 때, 2자리 수라면 100을 더 했을 때 무조건 양수가 나온다. 

     그 양수는 10, 100, 의 보수이다. 구구절절 길게 썼는데 자리 내림한 거랑 똑같다. 

 

     예시는 -6 이니까 4가 나왔다. 13 + 4 = 17 이고 10을 더 해줬으니까 10은 무시하면 7이다. 

https://www.youtube.com/watch?v=oUqz4SKgofU

 

이제 이진수에서 보수를 구해보자...! 

 

예) 13 - 10 = 3 => 1101 - 1010  = 0011

 

1) 십진수에서 말했던 방법으로 풀이 하면 

1101  + (10000 -1010) = 10011

1101 + 0101 = 0011

 

2) 10000 은 5 비트라서 이 방식으로 계산하는 거 같다 

 

일단 이진수에서 1은 0, 0은 1로 바꾸면 1의 보수가 된다. NOT 연산과 같다. 

(1111을 더하는 것과 같은 값이다)

 

1010 -1 =  0101

1101 + 0101  = 10010 

 

맨 앞자리가 1인 경우에 맨 앞자리 1은 버리고 1을 더해준다. 

=> 1111을 더했는데 맨 앞자리를 뺀 건 10000을 뺀 거니까 +1 을 해줘서 맞춰줌 

 아무생각 없이 계산만 따라서 하다가 보니까 이 부분을 놓쳐서 뇌정지가 왔다... ㅎㅎ 

 

자릿수 변동이 없는 경우에는 마이너스를 붙여주고 1의 보수로 다시 변환한다.

=> 10000을 빼지 않고 1의 보수 처리를 통해 1111을 뺀 것과 동일한 효과를 주었기 때문에 자릿수가 바뀐 것과 달리 

+1을 해준다거나 같은 처리가 없음 

 

3) 곱셈, 나눗셈 

곱셈은 덧셈을 여러 번 하는 것이고, 나눗셈은 뺄셈을 여러 번 하면 되므로 결국 덧셈으로 모두 처리가 가능하다. 

 

zero division error 가 발생하는 이유기도 하다. 0을 무한번 빼도 끝이 안 나기 때문에 오류가 발생한다.

 

더 알아보기

더보기

논리회로

ADD 를 나타내는 기호. A* B = Y. 논리 곱 이라고도 한다.

A와 B도 1인 경우에 Y가 1이다. 

A B Y
0 0 0
0 1 0
1 0 0
1 1 1

 

OR 를 나타내는 기호. A + B = Y. 논리 합 이라고도 한다.

A 또는 B가 1일 때  Y가 1이 된다.

A B Y
0 0 0
0 1 1
1 0 1
1 1 1

XOR 를 나타내는 기호

A와 B의 값이 다를 때, 전류를 보낸다.

A B Y
0 0 0
0 1 1
1 0 1
1 1 0

NOT을 나타내는 기호

A Y
0 1
1 0