CS

보수, 10의 보수와 2의 보수

NCOOKIE_ 2022. 7. 28. 04:20

컴퓨터에서는 음수를 표현하기 위해서 2의 보수를 사용한다. 이건 고등학교 때 배웠었고 이해하고 있다고 생각했었는데, 최근 다시 접하니 잘 모르거나 애매한 부분이 꽤 있었다. 그래서 보수에 대한 개념부터 2의 보수를 사용해 뺄셈을 하고 음수를 표현하는 방식에 대해 정리해보려고 한다.

 

 

보수란?

보수(complement)란 각 자리의 숫자의 합이 어느 일정한 수가 되게 하는 수를 뜻한다. 이를 일반화하면 'x에 대한 (x+k)에 대한 보수는 k'라고 할 수 있다.

 

Ex1) 십진수 4의 10의 보수는 6

Ex2) 십진수 11의 15의 보수는 4

 

이해를 돕기 위해서 우리가 일상적으로 사용하는 10진수를 예시로 들어 먼저 설명해보자.

 

 

9의 보수

각 자리의 숫자의 합이 9가 되게 하는 수이다. 10진수 258의 9의 보수는 999 - 258 = 741이다.

 

 

10의 보수

숫자의 합이 10의 제곱이 되게 하는 수이다. 10진수 258의 10의 보수는 1000 - 258 = 742이다. 즉, 9의 보수에서 +1을 한 것과 같다.

 

그럼 이 보수를 이용하여 뺄셈을 해보자.

 

Ex1) 500 - 258 계산

1) 컴퓨터에서는 가산만 가능하기 때문에 그에 맞게 형태를 취해준다.

500 + (-258)

2) 감수의 보수를 취해준다.

999 - 258 + 1 = 742

3) 두 수를 더한다.

500 + 742 = 1242

4) 올림수(carry)가 나오면 버리고 그렇지 않다면 결과값이 음수이므로 보수를 취해주고 마이너스 부호를 붙혀준다.

1242에서 천의 자리수 1은 올림수이므로 버린다. => 242

5) 따라서 결과값은 242이다.

 

만약 결과값이 마이너스라면 어떻게 될까?

 

Ex2) 100 - 258 계산

1) 100 + (-258)

2) 999 - 258 + 1 = 742

3) 100 + 742 = 842

4) 올림수가 생기지 않았기 때문에 결과값은 음수임을 알 수 있음. 따라서 10의 보수를 취해준다.

842의 10의 보수 => 999 - 842 + 1 = 158

5) 따라서 결과값은 -158이다.

 

 

1의 보수

각 자리의 숫자의 합이 1이 되게 하는 수이다. 2진수에서는 반전을 해줘서 구할 수 있다.

 

Ex) 이진수 1011의 1의 보수는 0100

 

 

2의 보수

어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수이다. 1의 보수를 취해주고 1을 더한 것과 같다.

 

Ex) 이진수 1011의 2의 보수

  10000

-)  1011

-------------

      0101

 

OR

 

1011의 1의 보수 => 0100

0100 + 1 = 0101

 

2의 보수를 이용한 뺄셈을 하는 방법은 위에서 했던 10의 보수를 이용한 뺄셈과 똑같다.

 

Ex1) 0001 1111 0100 - 0001 0000 0010    (500 - 258)

1) 컴퓨터에서는 가산만 가능하기 때문에 그에 맞게 형태를 취해준다.

0001 1111 0100 + (-0001 0000 0010)

2) 감수의 보수를 취해준다.

0001 0000 0010의 2의 보수 => 1110 1111 1110

3) 두 수를 더한다.

0001 1111 0100 + 1110 1111 1110 = 1 0000 1111 0010

4) 올림수(carry)가 나오면 버리고 그렇지 않다면 결과값이 음수이므로 보수를 취해주고 마이너스 부호를 붙혀준다.

5) 따라서 결과값은 0000 1111 0010이고 10진수로는 242이다.

 

Ex2) 0000 0110 0100 - 0001 0000 0010    (100 - 258)

1) 0000 0110 0100 + (-0001 0000 0010)

2) 0001 0000 0010의 2의 보수 => 1110 1111 1110

3) 0000 0110 0100 + 1110 1111 1110 = 1111 0110 0010

4) carry가 생기지 않음 => 결과값이 음수이므로 보수를 취해주고 마이너스 부호를 붙힌다.

0000 0000 1001 1110에서 음수를 표현하기 위해 최상위 비트를 1로 바꾸어준다.(데이터를 16bit에 저장한다고 가정)

5) 따라서 결과값은 1000 0000 1001 1110이고 10진수로 변환하면 -158이다.

 

 

참고링크

10의 보수 - 제타위키

2의 보수 - 제타위키

[컴퓨터 구조] 10의 보수 2의 보수, 보수에 관해 1

논리회로 보수의 모든 것 (10의 보수, 9의 보수, 2의 보수, 1의 보수, 보수를 쓰는 이유, 보수를 이용한 뺄셈)