컴퓨터에서 정수 표현 법

차례.
   -보수 설명 
   -보수만들기
   -왜 보수 사용하나
   -컴퓨터에서 정수 표현법
   -2 의 보수 사용하는 이유

(1) 보수 설명

각 진법에는 어떤 보수가 있는가?
n 진법에는 n 의 보수와 n-1 의 보수가 있다.

(2) 보수 만들기

먼저 익숙한 10 진수에서 9 의 보수와 10 의 보수에 대해서 알아보자. (이진수에서도 개념은 동일하다)

(보기) 10 진수 35 의 9 의보수와 10 의 보수는?

(풀이) 10 진수에서 9 의 보수는 9 에서 각 자리를 뺀 값이 9 의 보수가 된다. 35 의 9 의 보수는 64 이다.
n-1 보수에서 n 보수로 바꿀 때는 n-1 보수에서 1 을 더하면 n 보수가 된다. 그러므로 35 의 10 의 보수는 64 에서 1 을 더한 65 가 된다.#

(보기) 2 진수 101 의 1 의보수와 2 의보수는?

(풀이)

1 의 보수는 1 을 각 자리에서 빼면 1 의 보수이다. 101 의 1 의 보수는 010 이다. 2 의 보수는 이 수에서 1 을 더한하 011 이 2 의 보수이다. #
정리하면 , n 진법에서는 n-1 의 보수 , n 의 보수가 존재한다. n-1 의 보수를 구할 때는 n-1 을 각 자리에서 빼면 구할 수 있고, 이 수에 1 을 더하면 n 의 보수가 된다.

(3) 왜 보수를 사용하나?

컴퓨터는 뺄셈도 덧셈으로 답을 구한다. 어떻게 뺄셈을 덧셈으로 답을 구할 수 있는지는 보수의 성질을 이용한다는 것이다.

우리에게 익숙한 10 진수로 감산을 어떻게 가산처럼 행하는지를 알아보자.

(보기) 아래 식은 답이 54 이다. 보수를 이용하여 어떻게 54 를 구하는지를 알아보자.

  83
- 29
-----
(설명) 양수의 보수는 수 그대로이고 , 음수의 보수는 전에 배운 대로 구한다는것이다.
  1. 9 의 보수를 사용하는 경우
    먼저 두 수의 9 의보수를 구한다.
    • 83 의 9 의 보수는 83
    • -29 의 9 의 보수는 70

    두수를 더하면

    밖으로 나가는 올림수(carry)가 발생했다. 이 캐리를 end-around carry 라 하고 9 의 보수에서는 이 캐리가 발생하면 다시 더 해야 한다.

  2. 10 의 보수를 사용하는 경우
    먼저 두 수의 10 의보수를 구한다.
    • 양수 83 의 10 의 보수는 83
    • 음수 29 의 10 의 보수는 71

    두 수를 더하면,

    10 의 보수에서는 end-around carry 를 무시한다.

(4) 컴퓨터에서 정수 표현법

정수를 표현하는 방법은 3 가지

설명의 편의를 위해 4 비트로 정수를 표현한다고 가정하자.

부호화 절대치 방법은 수를 나타내는 자리에 10 진수를 2 진수로 바꾸어 나타내고, 음수이면 첫 비트를 1 , 양수이면 0 로 나타내는 방법이고 ,

1 의 보수 방법 은 구한 부호화 절대치에서 부호 비트가 1 즉 음수인 경우 수 비트를 1 이면 0 으로, 0 이면 1 로 반전(1 을 각자리에서 빼는 것과 동일)하여 나타내는 방법이고

2 의 보수 방법 은 첫 비트가 1 인 음수인 경우 1 의 보수 방법으로 구한 수에 1 을 더하는 방법이다.

(보기) -3 의 부호화 절대치 , 1 의보수 , 2의보수로 표현하면?

(풀이) 기억해야 할 것은 첫 비트 즉 부호 비트는 변하지 않는다는 것이다.

#

정리해보면, 어떤 수를 2 의 보수과정으로 바꿀 때

10 진수를 부호화 절대치로 바꾸고 --> 이를 1 의 보수로 바꾸고 --> 구한 수에서 1 을 더해서 2 의 보수
과정을 거쳐서 구할 수 있다.

문제의 핵심

부호화 절대치에서 1의 보수를 거치지 않고 바로 2 의 보수를 구하는 방법은 부호화 절대치에서 오른쪽에서 왼쪽으로 오다 만다는 첫 비트가 1 일 때 까지 그대로 나머지는 반전(부호 비트 제외) 시키면 구할 수 있다.

이 부분을 이해하면 이 문제에 대한 답이다.

(5) 2 의 보수를 사용하는 이유

2 의 보수를 사용하는 장점으로는
  1. 단 하나의 0 이 존재한다.
    1 의 보수와 부호화 절대치에서는 -0 이 존재한다. 이는 좋은 현상이 아니다.

  2. 단 한 번의 덧셈으로 두 수를 더할 수 있다.
    1 의 보수에서 덧셈시 end-around carry 가 다시 더해야 하기에 두 번의 덧셈이 필요하지만 , 2 의 보수에서는 이 캐리를 무시하므로 단 한 번의 덧셈으로 연산이 가능하다.

  3. 수의 표현 범위가 음수쪽으로 하나 많다.
    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 바이트로 확장을 하면

(6)최대 혹은 최소값 구할 때 초기값 설정

int a;

a = 0x7FFFFFFF; // 가장 큰 수로 보초(sentinel)를 세울 때
int a;

a = 0x80000000; // 가장 작은 수로 보초(sentinel)를 세울 때
출처:dovelet

[질/답]
[홈으로]  [뒤 로]
[푼 후(0)]