본문 바로가기
헝클어진 알고리즘

음수의 보수표현

by 배굿맨 2021. 9. 8.

보수란?

 

보충수()이다. 차량 냉각수의 수위가 낮다면? 냉각수를 보충해 준다. 숫자값이 부족하다면 숫자를 보충해주는 것이다. 암산으로 더하거나 뺄 때 사용한다. 왜? 편하니까.

 

15 - 7 = 10 -7 +5 = 8

로 해서 푼다. 왜? 논리적이며 빠르니까.

 

그런데 여기서 10-7? 

 

(1)은 10에서 7을 빼라는 의미이다.

(2)식은 10에서 음수인 7을 더해주라는 의미이다.

 

이해될 것이다.  

 

이제부터는 음수를 표현하기 위한 보수 개념이 나온다. 이전까지는 우리가 계산을 빠르게 하기 위한 방법으로 보수를 사용했다면 이제부터는 음수를 표현하기 위한 보수를 사용한다는 의미이다.

 

음수 -8을 예를 들면,

 

음수 -8은 +10-8-10과 같다. 왜 10? 편하니까... +9-8-9해도 된다.

 

즉, (10-8)-10과 같다. 그래?

 

그러면 힌트는 모두 나왔다.

 

음수 -8를 표현하기 위해 숫자 8의 10의 보수를 찾는다. 값은 2이다. 내가 보수 취했다고 기록해 놓자. 왜냐면 나중에 -10을 해주어야 하니까.

 

문제) 3에서 8을 빼는 것을 일반사칙연산과 10의 보수표현을 이용해서 각각 설명하시오.

답:

1. 사칙연산을 풀면

3-8=-5

2. 음수의 10의 보수 표현을 이용해서 풀면 

음수 -8의 10의 보수표현은 2. 이 값을 아래와 같이 연산하면

3+2=5

아까 -10을 해야 등호가 성립한다고 했으니까

5-10=-5

 

하나 더

문제) -6+4를 윗 2가지 방식으로 풀어서 설명하시오.

1. 사칙연산

-6+4=-2

2. 음수의 10의 보수 표현을 이용해서 풀면,

음수 -6의 10의 보수 표현은 4. 이 값을 아래와 같이 연산하면

4+4=8

아까 -10을 해야 등혹가 성립한다고 했으니까

8-10=-2

 

위에서 길게 설명한 것은 $a^n -b -a^n$  이다.

a는 진법, n은  b보다 큰 자릿 수, b는 보수를 취하는 값이다.

 

그럼, -888은? 

 

888의 1000의 보수는?

1000-888= 112이다.

 

여기서 -888+44는 112+44= 156이 된다.

 

그럼 실제값은?

 

156-1000=-844

-888+44=-844

 

어떤 것의 보수는 한 자리 더 큰 값에서 빼주는 것이다. 10진법에서는 한자리 더 높은것이 10이므로 10의 보수가 있다. 물론 9의 보수도 있다. 그런데 8의 보수는? 9라는 것에서 8의 보수를 구하면 -1이 나온다. 기껏 음수표현을 양수표현으로 바꿀라고 했는데 음수가 나왔다. 땅을 파려고 삽을 만들었는데 삽이 파인다. -_-;;;

 

2진수에서는 어떨까?

 

2진수는 2의 보수와 1의 보수를 가진다. 2의 보수는 10진수와 똑 같이 상위비트를 하나 빌려오는 것이고 1의 보수는 각 비트가 1만큼 얼마만큼의 보충수가 필요한가이다.

 

1의 보수는 매우 빠르게 구할 수 있어서 1의 보수부터 설명하는데 컴퓨터에서는 1의 보수는 사용하지 않고 2의 보수체계로써 덧셈연산을 수행한다.

 

왜냐면... 

 

여기서 잠시! 아래 문장에 볼드 한번 쳐서 강조하고 줄거리를 이어가겠다. 

 

컴퓨터에서 양수의 보수 표현은 없다.

 

우리는 음수를 표현하기 위해서 보수를 쓴다는 점을 명심해야 한다. 5의 보수는? 이라고 물어보면 이것은 잘못된 물음이다. -5의 보수는 무엇인가? 라는 질문은 성립한다. 왜냐면, 우리는 음의 정수를 표현하기 위해서 보수라는 개념을 가지고 왔기 때문이다.  (더 엄밀히는 -5의 10의 보수는 얼마인가라고 물어야 된다). 

 

자. 돌아와서 왜냐면...에 대한 답변을 달아보자.

 

0부터 9까지의 숫자가 있다. 1 개의 자리수로 표현할 수 있는 숫자값들이다. 우리 손가락이 10개이기 때문에 10진법으로 아라비아 숫자가 만들어졌다는 것은 초등학교 때 배운것 같다.

(아마도... 우리 손가락이 8개 였다면 우리는 훨 씬 과거에 컴퓨터를 발명하지 않았을까?)

 

3개의 비트를 묶어서 사용하는 레지스터로 동작하는 CPU라고 가정하면 표현가능 한 수는 아래와 같이  2의 3승 개의 숫자를 표현할 수 있다.

 

$000{_2}$ $001{_2}$  $010{_2}$  $011{_2}$  $100{_2}$  $101{_2}$ $110{_2}$  $111{_2}$

 

그러면 윗 식에서 보면 맨 처음 시작 비트(MSB)가 0인 것은 양수로, 시작 비트가 1인 것은 음수로 쓰면 어떨까? (최상위비트로 양/음수를 나타내는 방법)

 

즉, 집합 A={0,1,2,3,4,5,6,7,8,9} 에서 반은 음수로, 반은 양수로 사용하려고 한다면, 아래와 같이 대응된다.

 

$000 {_2}$ -> 0

$001 {_2}$ -> 1 

$010 {_2}$ -> 2 

$011 {_2}$ -> 3

$100 {_2}$ -> -0

$101 {_2}$ -> -1

$110 {_2}$ -> -2

$111 {_2}$ -> -3

 

그런데 문제가 있다. 즉, 최상위 비트를 가지고 정수를 구분하면 2개의 2진수 값(000과 100)이  0을 표현하게 된다. 논리적으로 맞지 않게 되며, 최상위 비트를 읽어서 음수와 양수를 분리해 낼 수도 없다.

 

(0은 짝수인가? 짝수이다. 2로 나누어서 나머지가 없으므로. 0은 양수인가? 0은 0이다. 0은 양수도 아니고 음수도 아니다.)

 

그러면, 잠시 2진수는 머리 아프니 10진수 가지고 해 보자. 일단 영역을 나누자.

0, 1, 2, 3, 4   | 5, 6, 7, 8, 9

 

그리고 아래와 같은 값과 대응한다고 생각해 보자. 

 

A: 0, 1, 2, 3, 4 | -1, -2, -3, -4, -5 또는

$B: 0, 1, 2, 3, 4 | -5, -4, -3, -2, -1       -------- (3)$

가 된다. 여기서 좌측 구역에는 부호가 없다. 그러면 양수의 갯수와 음수의 갯수가 동일함을 알 수 있다. 단, 음수의 절대값이 하나 더 크다. (왜냐면 시작이 -1이므로)

 

우리는 B형식을 사용한다. 

 

자. 그러면 -5, -4, -3, -2, -1을 각각 5, 6, 7, 8, 9에 대응시키면 된다.  (음수의 보수표현)

(눈썰미가 있다면 보수와 관련 있음을 알 수 있다.)

 

첫 째, -5 를 가지고 과거 우리가 하던 방식(보수취하기)부터 하면,

먼저, 부호를 없앤다.

-5 -> 5

다음에 숫자 5의 10의 보수를 구한다. (10에서 5를 뺀다)

5

 

둘 째, -4 -> 4

다음에 숫자 4의 10의 보수를 구한다.

6

 

셋 째, -3->3

3의 보수

7

 

넷 째, 다섯 째 등등.

 

모두 모아 쓰면

-5, -4, -3, -2, -1 -> 5, 6, 7, 8, 9가 된다.

어라 바로 매칭이 되네? 해 놓코 보니 신기하다. 

 

즉, 음수를 보수표현해서 사용하면 1:1매칭이 됨을 알았다. (다시한번 강조, 음수의 보수표현)

 

(그리고 계산을 빠르게 하기 위해서 음수의 보수라는 것은 그 값(음수값)을 그대로 10에 더해준 숫자이다(10을 더해준 숫자). 어렵게 부호를 제거하고 빼나 부호를 놔 둔체로 더해주나 그게 그말이다.)

 

즉, -2의 10의 보수는? 10-2=8이다.

 

뭐야 그냥 10을 더해준 값을 적었네?

 

문제 풀면서 숙달시켜보자.

 

문제) 7은 어떤 음수의 보수인가?

7은 보수표현임을 알 수 있다. 우측 구역에 있으므로. 그래서,

7에 10을 빼면 -3이 나온다.

 

검증 : -3의 보수는?

-3에서 부호를 없앤다. -> 3

3의 보수를 구한다. 7 

 

*재강조: 우반구에 있는 것들은 어떤것의 보수이므로 10을 빼준다. 그러면 원래값이 나옴.

 

이번엔 보수를 취해서 덧셈을 하는 간단한 문제이다.

 

문) 1-2=? 를 컴퓨터가 연산하는 순서대로 계산하시오.

 

1-2 를 1+(-2) 로 변환

음수 -2의 10의 보수를 구한다. -> 8. (컴퓨터는 2의 10의 보수를 취할테고 우리는 -2에 10을 더해준다.)

그러면 1+(8)=9가 나온다.
9는 우반구에 있으므로 어떤값의 보수표현이므로 역보수 값(원래 값)을 구해 줄 수 있다..

보수값을 구할 때 10을 더해주었으니 이번에는 10을 빼준다.

9-10=-1 컴퓨터는 9를 보면 최상위 비트가 1(왜냐하면 우리는 지금 3비트로 이루어진 숫자들의 집합에서 보고 있기 때문).이므로 어떤것의 보수표현임을 알고 있다.

 

문) 1-3은?

1+(-3)

-3의 보수는? 7

1+(7)은 8 

역으로, 8이란 값의 원래값은? -2

-2가 답이다.

 

문) 4-3

4+(-3)

4+7

11(10의 자리수는 버린다. 보관할 자리가 없다. 즉, 캐리가 발생하면 버려 버리면 된다. 그런데 9의 보수는 캐리를 연산에 피드백시켜야 한다.)

그러므로 1.

1은 좌측반구에 속하는 숫자이다. 그러므로 양수 1.

 

문) 3-5는?

3+(-5)

3+5

8

우반구에 속하므로 어떤수의 보수 값

그러므로 원래값은 -2

 

아래 문제는 안 읽어 도 됨.

문) 2+3은?

2+3 = 5

컴퓨터는 그냥 5로 인식하지 않고 보수인 5로 인식한다. 그래서 이 값을 출력하면 -5가 된다. 프로그래밍 할 때 이런 오버플로우를 조심해야 한다.

 

*결론은 음수를 표현하기 위해서는 자기 숫자에 10을 더해주면 된다는 것이고 이 값을 10의 보수라고 말한다.

 

두 자릿수에서는 어떨까?

 

{01, 02, 03, 04, .... 99}

01, 02, 03, ... , 49 | 50, 51, ... , 99

대칭시키려면

01, 02, 03, ..., 49 | -50, -49, -48, ... -1

 

-33의 보수는? 100 - 33 = 77이다.

77은 어떤수의 보수인가? 77-100 = -33이다. 바로 나온다. 

 

이러면 100의 보수 아냐? 하고 물어보면 머리 아픈데... 우리가 상위 자릿수에서 하나 빌려서 계산하기 때문에 10의 보수라고 말하는 것 같다.

 

자 이제 다시, 2진수를 가지고 해보자. (2진수 음수의 보수표현)

 

2진법도 음수를 표현하기 위해서는 자기 숫자에 한자리 높은 수의 값을 더해주면 된다.

한자리의 2진수라면, 십진법으로 볼 때는 2(십진수)를 더해주거나, 2진법으로 볼 때는 10(일공)(2진수)을 더해주면 된다. 

 

3개 비트만 가지고 해보자.

$000_2$ $001_2$ $010_2$ $011_2$ $100_2$ $101_2$ $110_2$ $111_2$

위와 같이 8개의 경우의 수만 있다.

 

그러므로 반으로 나누면

10진수 : 0 1 2 3 | 4 5 6 7

2진수 :  $000 {_2}$ $001 {_2}$ $010 {_2}$ $011 {_2}$ | $100 {_2}$ $101 {_2}$ $110 {_2}$ $111 {_2}$

좌측은 부호 없는 수, 우측은 음수로 대응시키자.

 

10진수 : 0 1 2 3 | -4 -3 -2 -1

2진수 :   $000 {_2}$ $001 {_2}$ $010 {_2}$ $011 {_2}$ | $-100 {_2}$ $-011 {_2}$ $-010 {_2}$ $-001 {_2}$

와 같이 된다.

 

즉, $-100 {_2}$ , $-011 {_2}$ , $-010 {_2}$ , $-001 {_2}$ 을 $100 {_2}$ (4), $101 {_2}$ (5), $110 {_2}$ (6), $111 {_2}$ (7)에 대응해 주면 된다.

 

MSB가 1인 보수표현된 숫자를 원래대로 복원학기

10진수에서 보수표현된 숫자를 원래의 값으로 복원하기 위해서 처음 더해준 수를 빼 주었듯이 2진수도 아래처럼 $1000{_2}$을 빼준다.

 

$100 {_2}$ 에서 $-1000 {_2}$ 이면 $-100 {_2}$

$101 {_2}$ 에서 $-1000 {_2}$ 이면 $-011 {_2}$

$110 {_2}$ 에서 $-1000 {_2}$ 이면 $-010 {_2}$

$111 {_2}$ 에서 $-1000 {_2}$ 이면  $-001 {_2}$ 이 된다. 1:1 대응관계이다. 그리고, 1로 시작하면 음수이다.

1로 시작하면 음수이다. 다시 강조.

 

연습)

 

먼저, 음수 $-011 {_2}$ 를 가지고 진행해 보자.

부호를 없앤다.

$-011 {_2}$ -> $011 {_2}$

그리고 2의 보수를 취한다. $1000 {_2}$ 에서 빼 주면 된다.

답은 음수 $-011 {_2}$ 의 2의 보수표현은 $101 {_2}$ 이다.

 

검증) $101 {_2}$ 은 어떤 음수의 2의 보수 표현이다. 원래의 값은?

$101 {_2}$ 에 $-1000 {_2}$ 을 빼주면 $-011 {_2}$ 이다.

 

문) 음수 $-100 {_2}$ 인 수의 2의 보수표현은?

 

$1000 {_2}$ 을 그대로 더해주면 된다.

$1000 {_2}$ $-0100 {_2}$ = $100 {_2}$ 이다. 

원래 수로 바꾸려면 $1000 {_2}$ 을 빼 주면 된다.

$-1000 {_2}$ +$100 {_2}$ = $-100 {_2}$

 

그런데, 어떤 똑똑한 분이 1의 보수를 만들었다. 2의 보수와 1의 보수와의 관계는 1을 더하거나 빼서 숫자를 가지고 노는게 편하기는 하다. (그런데... 우리는 보통 1의 보수부터 배운다. 실제로는 2의 보수를 사용하는데. 그래서 본 포스트는 2의 보수부터 설명했다.)

 

$-011 {_2}$ 의 1의 보수는? $100 {_2}$ 이다. 부호를 없애고 각 비트들을 반전시킨다. 이말은 $1000{_2}$을 더한것이 아니라 하나 작은 수 $111{_2} $을 더한 것이다. 그러므로 1의 보수에서 2의 보수를 구하려면 1을 더해주면 된다.

 

문제: $100{_2}$은 1의 보수이다. 이것을 2의 보수로 나타내면? 답은 $101{_2}$ .

 

거꾸로 가면서 증명해보자. 2의 보수 $101{_2}$은 어떤 음수를 표현했나?

 

하나 뺀다. $100 {_2}$

반전한다. $011 {_2}$

부호를 붙인다. $-011 {_2}$

 

위처럼 1의 보수를 이용하면 매우 쉽게 보수로 표현된 음수값을 매우 쉽게 구할 수있다. 그러나, 컴퓨터에서 1의 보수체계를 사용하지 않는다. 이유는 바로 아래와 같다.

 

1의 보수로 표현하면, 최상위 비트가 0임에도 불구하고 음수와 대응관계에 있기 때문이다. 즉, $011 {_2}$ 이 $-100 {_2}$ 의 1의 보수인지 아니면 양수 $011 {_2}$ 인지 확인 할 방법이 없다는 것이다.

 

앞에서 10의 보수를 취하면서 설명한 것이 있다. 이것은 (식 3)에서 보았다. 

B: 0, 1, 2, 3, 4 | -5, -4, -3, -2, -1

 

여기서 9의 보수를 취해보자. 그러면, 그 대응관계는

 

-5, -4, -3, -2, -1 -> 4, 5, 6, 7, 8이 된다.

(5의 9의 보수 -> 4)

 

4가 중복되어 1:1 매칭이 되지 않는다. 그래서 1의 보수는 컴퓨터에서 사용하지 않는다. 단, 비트반전 후, 1을 더해주는 것이라 2의 보수를 구하기가 쉬운점은 있다. 

 

외울 점)

컴퓨터에서 보수란 음수를 표현하기 위한 방식이다.

컴퓨터는 2의 보수를 사용해서 음의 수를 표현한다.

1의 보수는 2의 보수와 1의 값 차이가 난다.

정수를 담고 있는 그릇에서 최상위 비트가 1이면 음수이다.

컴퓨터에서 처리하는 정수는 음의 정수가 양의 정수보다 한 개가 더 많다. (왜냐면 0은 양의 정수 구역에 들어가 있고, 음수는 -1부터 시작하기 때문이다.)

 

*complement의 뜻

보충수, 완전함을 만들어주는 것.

삼각함수 배울 때 여각을 배웠다. complement angle.

30도의 여각은? 70도.

이유는? 90도에서 30도를 빼주기 때문이다.

그래서 sin(90-x)=cos(x)이다.

cos=cosine=complement+sine <= sin의 여각은 cos이다!