차례. -보수 설명 -보수만들기 -왜 보수 사용하나 -컴퓨터에서 정수 표현법 -2 의 보수 사용하는 이유
n 진법에는 n 의 보수와 n-1 의 보수가 있다.
- 10 진법에는 9 의 보수와 10 의 보수가 있고 ,
- 16 진법에는 15 의보수와 16 의 보수가 있다.
- 2 진법에는 1 의보수와 2 의 보수가 있다.
먼저 익숙한 10 진수에서 9 의 보수와 10 의 보수에 대해서 알아보자. (이진수에서도 개념은 동일하다)(보기) 10 진수 35 의 9 의보수와 10 의 보수는?
(풀이) 10 진수에서 9 의 보수는 9 에서 각 자리를 뺀 값이 9 의 보수가 된다.n-1 보수에서 n 보수로 바꿀 때는 n-1 보수에서 1 을 더하면 n 보수가 된다. 그러므로 35 의 10 의 보수는 64 에서 1 을 더한 65 가 된다.#35 의 9 의 보수는 64 이다.
- 9 - 3 = 6
- 9 - 5 = 4
(보기) 2 진수 101 의 1 의보수와 2 의보수는?
(풀이)
1 의 보수는 1 을 각 자리에서 빼면 1 의 보수이다.정리하면 , n 진법에서는 n-1 의 보수 , n 의 보수가 존재한다. n-1 의 보수를 구할 때는 n-1 을 각 자리에서 빼면 구할 수 있고, 이 수에 1 을 더하면 n 의 보수가 된다.101 의 1 의 보수는 010 이다. 2 의 보수는 이 수에서 1 을 더한하 011 이 2 의 보수이다. #
- 1-1=0
- 1-0=1
- 1-1=0
컴퓨터는 뺄셈도 덧셈으로 답을 구한다. 어떻게 뺄셈을 덧셈으로 답을 구할 수 있는지는 보수의 성질을 이용한다는 것이다.우리에게 익숙한 10 진수로 감산을 어떻게 가산처럼 행하는지를 알아보자.
(보기) 아래 식은 답이 54 이다. 보수를 이용하여 어떻게 54 를 구하는지를 알아보자.
83 - 29 -----(설명) 양수의 보수는 수 그대로이고 , 음수의 보수는 전에 배운 대로 구한다는것이다.
- 9 의 보수를 사용하는 경우
먼저 두 수의 9 의보수를 구한다.
- 83 의 9 의 보수는 83
- -29 의 9 의 보수는 70
두수를 더하면
밖으로 나가는 올림수(carry)가 발생했다. 이 캐리를 end-around carry 라 하고 9 의 보수에서는 이 캐리가 발생하면 다시 더 해야 한다.
- 10 의 보수를 사용하는 경우
먼저 두 수의 10 의보수를 구한다.
- 양수 83 의 10 의 보수는 83
- 음수 29 의 10 의 보수는 71
두 수를 더하면,
10 의 보수에서는 end-around carry 를 무시한다.
정수를 표현하는 방법은 3 가지
- 부호화 절대치
- 1 의 보수
- 2 의 보수
설명의 편의를 위해 4 비트로 정수를 표현한다고 가정하자.
부호화 절대치 방법은 수를 나타내는 자리에 10 진수를 2 진수로 바꾸어 나타내고, 음수이면 첫 비트를 1 , 양수이면 0 로 나타내는 방법이고 ,
- 첫 비트는 부호를 표현한다. 0 은 양수 1 은 음수로 약속
- 나머지 3 비트로 수를 표현한다.
1 의 보수 방법 은 구한 부호화 절대치에서 부호 비트가 1 즉 음수인 경우 수 비트를 1 이면 0 으로, 0 이면 1 로 반전(1 을 각자리에서 빼는 것과 동일)하여 나타내는 방법이고
2 의 보수 방법 은 첫 비트가 1 인 음수인 경우 1 의 보수 방법으로 구한 수에 1 을 더하는 방법이다.
(보기) -3 의 부호화 절대치 , 1 의보수 , 2의보수로 표현하면?
(풀이) 기억해야 할 것은 첫 비트 즉 부호 비트는 변하지 않는다는 것이다.
#
정리해보면, 어떤 수를 2 의 보수과정으로 바꿀 때
10 진수를 부호화 절대치로 바꾸고 --> 이를 1 의 보수로 바꾸고 --> 구한 수에서 1 을 더해서 2 의 보수과정을 거쳐서 구할 수 있다.
문제의 핵심부호화 절대치에서 1의 보수를 거치지 않고 바로 2 의 보수를 구하는 방법은 부호화 절대치에서 오른쪽에서 왼쪽으로 오다 만다는 첫 비트가 1 일 때 까지 그대로 나머지는 반전(부호 비트 제외) 시키면 구할 수 있다.
이 부분을 이해하면 이 문제에 대한 답이다.
2 의 보수를 사용하는 장점으로는
- 단 하나의 0 이 존재한다.
- 1 의 보수와 부호화 절대치에서는 -0 이 존재한다. 이는 좋은 현상이 아니다.
- 단 한 번의 덧셈으로 두 수를 더할 수 있다.
- 1 의 보수에서 덧셈시 end-around carry 가 다시 더해야 하기에 두 번의 덧셈이 필요하지만 , 2 의 보수에서는 이 캐리를 무시하므로 단 한 번의 덧셈으로 연산이 가능하다.
- 수의 표현 범위가 음수쪽으로 하나 많다.
- 4 비트로 정수를 표현할 때 -8 을 부호화절대치 , 1 의 보수에서는 표현할 수가 없다. 4 비트로 정수를 표현할 때 -8 ~ 7 까지 표현가능하다.
n 비트로 정수를 표현할 때
- 부호화 절대치, 1 의 보수에서 수의 표현 범위는 -2n-1+1 ~ 2n-1-1
- 2 의 보수에서는 -2n-1 ~ 2 n-1-1
4 비트로 정수를 표현할 경우 10 진수 부호화 절대치 1 의 보수 2 의 보수 7 0111 0111 0111 6 0110 0110 0110 5 0101 0101 0101 4 0100 0100 0100 3 0011 0011 0011 2 0010 0010 0010 1 0001 0001 0001 0 0000 0000 0000 -0 1000 1111 x -1 1001 1110 1111 -2 1010 1101 1110 -3 1011 1100 1101 -4 1100 1011 1100 -5 1101 1010 1011 -6 1110 1001 1010 -7 1111 1000 1001 -8 x x 1000 이제 현재 정수를 표현하는 4 바이트로 확장을 하면
- 가장 큰수 : 0 1 1 1 1 .... 1 (16진수로 표현하면 7F FF FF FF ) 2^31 - 1
- 가장 작은수 : 1 0 0 0 0 0 0 0 ... 0 (16 진수로 표현하면 80 00 00 00 ) - 2^31
int a; a = 0x7FFFFFFF; // 가장 큰 수로 보초(sentinel)를 세울 때
int a; a = 0x80000000; // 가장 작은 수로 보초(sentinel)를 세울 때
출처:dovelet