728x90

컴퓨터에서의 수의 표현과 연산

  • 컴퓨터에서의 연산은 2진수 표현만으로는 덧셈 곱셈 연산만 가능하다.
  • 컴퓨터는 기본적인 2진수 표현에 대한 보수(Complement) 표현으로 바꿔서 뺄셈나눗셈 연산을 수행한다.

 

보수(Complement)

  • 보충해주는 수
  • 어떤 수 `a` 에 대한 `n` 의 보수는 `a` 와의 합이 `n` 이 되는 수
  • 기수가 `n` 인 어떤 수 `a` 에 대한 `n` 의 보수는 `n` 으로부터 `a` 까지 떨어진 거리라고도 할 수 있다.
  • `n` 진수에서의 보수는 `n` 의 보수와 `n - 1` 의 보수가 존재한다.
    • 10진수에는 10의 보수9의 보수가 존재하고, 5진수에는 5의 보수4의 보수가 존재하는 것처럼, 2진수를 사용하는 컴퓨터에서는 2의 보수1의 보수가 존재한다.

 

1의 보수(1's Complement)

어떤 2진수 `a` 와의 합이 `1(1_{2})` 이 되는 수

 

  • 2진수를 구성하는 숫자 `0_{2}` 과 `1_{2}` 에 대한 1의 보수는 다음과 같다.
    • `0_{2}` 에 대한 1의 보수 : $0_{2} + x = 1_{2} \quad ∴ x = 1_{2}$
    • `1_{2}` 에 대한 1의 보수 : $1_{2} + x = 1_{2} \quad ∴ x = 0_{2}$
  • 위 결과를 통해 2진수의 각 자리 숫자를 0은 1로, 1은 0으로 바꾸면 주어진 2진수의 1의 보수가 되는 것을 알 수 있다.
    • 예) `53_{10}` 의 2진수는 `110101_{2}` 이고, 이 수에 대한 1의 보수는 각 자리 숫자를 반대로 바꾼 `001010_{2}` 이다.

 

 

2의 보수(2's Complement)

어떤 2진수 `a` 와의 합이 `2(10_{2})` 가 되는 수
  • 2진수를 구성하는 숫자 `0_{2}` 과 `1_{2}` 에 대한 2의 보수는 다음과 같다.
    • `0_{2}` 에 대한 2의 보수 : $0_{2} + x = 0_{2} \quad ∴ x = 0_{2}$
    • `1_{2}` 에 대한 2의 보수 : $1_{2} + x = 10_{2} \quad ∴ x = 1_{2}$
  • 위 결과를 통해 2의 보수는 1의 보수에 `1_{2}` 을 더한 결과와 같음을 알 수 있다.
    • `0_{2}` 에 대한 2의 보수는 `0_{2}` 으로, `0_{2}` 에 대한 1의 보수 `1_{2}` 에 `1_{2}` 을 더한 결과와 같다. ($1_{2} + 1_{2} = 10_{2}$)
    • `1_{2}` 에 대한 2의 보수는 `1_{2}` 로, `1_{2}` 에 대한 1의 보수 `0_{2}` 에 `1_{2}` 을 더한 결과와 같다. ($0_{2} + 1_{2} = 1_{2}$)
    • 그러므로 주어진 2진수의 2의 보수는 2진수의 1의 보수에 1₂ 을 더한 결과이다.

 

예제 : 다음 2진수에 대한 1의 보수와 2의 보수를 구하라.

(a) `1101011_{2}`

(b) `100110110_{2}`

 

(a)

- 1의 보수 : `0010100_{2}`

- 2의 보수 : `0010101_{2}`

 

(b)

- 1의 보수 : `011001001_{2}`

- 2의 보수 : `011001010_{2}`

 

컴퓨터에서의 수의 표현

  • 컴퓨터는 데이터를 처리할 때 워드(Word) 단위로 처리한다.
  • 컴퓨터에서는 정수 데이터를 부호-절댓값, 부호-1의 보수, 부호-2의 보수 형태로 표현한다.

 

워드(Word)

  • 컴퓨터에서 한 번에 처리할 수 있는 1 바이트(Byte) 이상 크기의 데이터 단위
  • 워드의 기본 구조는 다음과 같다.

워드(Word)의 기본 구조

 

최상위 비트(MSB; Most Significant Bit)

  • 워드의 가장 왼쪽에 위치
  • 숫자에 대해서는 부호로 표현한다.
    • 0 : 양수
    • 1 : 음수
  • 문자에 대해서는 구분 기준으로 사용된다.

 

최하위 비트(LSB; Least Significant Bit)

  • 워드의 가장 오른쪽에 위치
  • 짝수나 홀수에 상관없이 주어진 단위 값이 되는 비트 위치
  • 가장 적은 숫자를 오른쪽에 기록하는 자리 표기법의 규정 때문에 가끔 Right-Most Bit 를 뜻하기도 한다. 

 

나머지 비트

  • 데이터 값을 표현하는 데 사용된다.

 

① 부호-절댓값(Sign-Magnitude) 표현

워드의 데이터 비트를 정수 데이터의 절댓값으로 표현하는 방식

 

  • 양수 `+53_{10}` 과 음수 `-53_{10}` 의 절댓값은 `|53_{10}|` 이며, 2진수로는 `110101_{2}` 이다. 이를 이용해 부호-절댓값 표현을 작성하면 다음과 같다.

부호-절댓값 표현

 

  • 최상위 비트는 부호를 의미하므로 양수 `+53_{10}` 에 대해서는 0, 음수 `-53_{10}` 에 대해서는 1로 표시한다.
  • 나머지 7비트의 데이터 비트 영역에는 절댓값 `|53_{10}|` 의 2진수 표현이 될 것이다.
  • 그런데 절댓값 `|53_{10}|` 의 2진수인 `110101_{2}` 는 6개의 비트로, 7비트의 데이터 비트를 모두 채우지 못한다. 이때 왼쪽에 남는 비트0으로 채운다.

 

② 부호-1의 보수(Sign-1's Complement) 표현

워드의 데이터 비트를 정수 데이터의 절댓값에 대한 1의 보수로 표현하는 방식

 

  • 부호-1의 보수 표현에서는 워드를 구성하는 비트 중 데이터 비트의 영역이 1의 보수로 채워지고, 부호 비트의 값은 바뀌지 않는다.
  • 양수의 경우, 부호-절댓값 표현과 같다.
  • 음수의 경우, 부호-절댓값 표현과 다르다.
  • 양수 `+53_{10}` 과 음수 `-53_{10}` 에 대한 부호-1의 보수 표현은 다음과 같다.

부호-1의 보수 표현

 

③ 부호-2의 보수(Sign-2's Complement) 표현

워드의 데이터 비트를 정수 데이터의 절댓값에 대한 2의 보수로 표현하는 방식

 

  • 부호-2의 보수 표현에서는 워드를 구성하는 비트 중 데이터 비트의 영역이 2의 보수로 채워지고, 부호 비트의 값은 바뀌지 않는다.
  • 양수의 경우, 부호-절댓값 표현과 같다.
  • 음수의 경우, 부호-절댓값 표현과 다르다.
  • 양수 `+53_{10}` 과 음수 `-53_{10}` 에 대한 부호-2의 보수 표현은 다음과 같다.

부호-2의 보수 표현

 

  • 양수 `+53_{10}` 과 음수 `-53_{10}` 에 대한 부호-1의 보수 표현과 부호-2의 보수 표현에서 알 수 있듯이, 부호 비트양수 `+53_{10}`에 대한 표현부호-절댓값 표현과 같다.

 

예제 : 1워드가 8비트일 때, 주어진 10진수를 부호-절댓값, 부호-1의 보수, 부호-2의 보수로 표현하라.

(a) `+89_{10}`

(b) `-119_{10}`

 

(a)

`+89_{10}` 의 절댓값은 `|89_{10}| = 1011001_{2}` 이고, 양수이므로 부호 비트는 0이다.

따라서, 부호-절댓값, 부호-1의 보수, 부호-2의 보수 표현 모두 `01011001` 이다.

 

(b)

`-119_{10}` 의 절댓값은 `|119_{10}| = 1110111_{2}` 이고, 음수이므로 부호 비트는 1이다.

(1) 부호-절댓값 표현 : `11110111`

(2) 부호-1의 보수 표현 : `10001000`  ((1)에서 부호 비트를 제외하고 나머지 비트들을 반전시켜준다.)

(3) 부호-2의 보수 표현 : `10001001`  (1의 보수 표현(2)의 맨 끝에 1을 더해 준다.)

 

워드 크기에 따른 데이터의 표현 범위

  • 컴퓨터에서 워드 단위로 데이터를 처리하면서 세 가지 방법으로 데이터를 표현할 때, 표현할 수 있는 데이터의 범위가 각각 다르다.
1워드가 `n` 비트인 컴퓨터에서 다음이 성립한다.

(a) 부호-절댓값 표현 범위 : $-(2^{n-1}-1) \; ∼ \; (2^{n-1}-1)$
(b) 부호-1의 보수 표현 범위 : $-(2^{n-1}-1) \; ∼ \; (2^{n-1}-1)$
(c) 부호-2의 보수 표현 범위 : $-2^{n-1} \; ∼ \; 2^{n-1}$

 

  • 예를 들어, 1워드가 8비트일 경우, 표현 범위는 다음과 같다.
    • 부호-절댓값 : 10진수 `-127` 부터 `127` 까지 표현 가능
    • 부호-1의 보수 : 10진수 `-127` 부터 `127` 까지 표현 가능
    • 부호-2의 보수 : 10진수 `-128` 부터 `128` 까지 표현 가능
  • 부호-절댓값부호-1의 보수 부호-2의 보수보다 표현 범위가 작을까? 그리고 컴퓨터에서는 어떤 표현 방식으로 연산을 할까? 이 질문에 대한 답을 알아보자. 편의상 1워드4비트라고 가정한다.

 

(1) 연산 결과가 틀리는 부호-절댓값 표현

  • 1워드가 4비트인 컴퓨터에서 $-3_{10} - 4_{10} = (-3)_{10} + (-4)_{10}$ 를 연산할 경우, 세 가지 표현 방식에 따른 덧셈 연산 결과는 다음과 같다.

-3 + (-4) 의 세 가지 표현

  • 위에서 볼 수 있듯이 연산 결과 모두 초과(Overflow)가 발생한다.
  • 이때 어떤 표현 방식을 이용하느냐에 따라 초과에 대한 처리 방식이 달라진다.
    • 부호-절댓값 표현부호-2의 보수 표현을 이용한 연산에서 발생하는 초과는 무시한다.
    • 부호-1의 보수 표현을 이용한 연산에서는 1차 연산 결과의 최하위 비트(LSB)에 초과한 비트를 더하여 연산을 완료한다.
    • 따라서 부호-절댓값 표현의 연산 결과는 `0111`, 부호-1의 보수 표현의 연산 결과는 `1000`, 부호-2의 보수 표현의 연산 결과는 `1001` 이다.
  • 각 연산 결과가 정확한지 확인해보자.
    • 우선 부호-1의 보수 표현의 연산 결과인 `1000` 과 부호-2의 보수 표현의 연산 결과인 `1001` 은 10진수로 변환하면 `-7_{10}` 이다.
      • 따라서 `-3_{10}-4_{10}` 에 대한 정확한 연산 결과를 확인할 수 있다.
    • 그러나 부호-절댓값 표현의 연산 결과인 `0111` 은 10진수로 변환하면 `+7_{10}` 로, `-3_{10}-4_{10} = -7_{10}` 이 아닌 틀린 결과를 얻는다.
      • 따라서 부호-절댓값 표현을 이용한 연산은 정확한 결과를 출력하지 못한다는 사실을 알 수 있다.

 

초과(Overflow)
  • 입력이나 연산의 결과가 1워드를 넘는 경우
  • 1워드가 `n` 비트일 때 `n + 1` 비트가 되는 경우
  • 이 때, 컴퓨터가 읽는 범위는 `n + 1` 비트 중 하위 1워드이다.

초과(Overflow)

 

(2) 0에 대한 표현이 2가지인 부호-절댓값 표현, 부호-1의 보수 표현

  • `0` 은 양수도, 음수도 아니므로 `+0` 또는 `-0` 이라는 표현은 존재하지 않는다.
  • 그런데 `0_{10}` 의 부호-절댓값 표현은 `0000(+0_{10})` 과 `1000(-0_{10})` 으로 2가지이며, 부호-1의 보수 표현 또한 `0000(+0_{10})` 과 `1111(-0_{10})` 로 2가지이다.
    • `+0` 과 `-0` 이라는 표현이 존재하지 않음에 위배된다.
  • 그러나, 부호-2의 보수 표현에서는 다음과 같이 초과되는 비트를 무시하므로, 10진수 `0_{10}` 은 `0000` 하나로 표현된다.

부호-2의 보수 표현

 

  • (1)(2)의 이유로 컴퓨터에서는 부호-2의 보수 표현을 이용하여 연산을 수행한다.

 

보수의 10진수 변환

  • 보수 표현부호-절댓값 표현동일한 양수의 경우, 2진수10진수로 변환하는 방법을 이용하여 10진수로 변환한다.
  • 반면, 보수 표현부호-절댓값 표현다른 음수의 경우 다음 방법을 이용하여 10진수로 변환한다.

 

부호-1의 보수로 표현한 값의 10진수 변환

  • 부호-1의 보수로 표현한 값을 10진수로 변환하는 방법은 다음 2가지가 있다. 두 방법 중 하나를 선택하여 구하면 된다.
① $-(2^{n-1} - 1)$ + (데이터 비트의 10진수 표현)
1의 보수 표현의 데이터 비트 부분을 다시 1의 보수로 변환한 후, 이를 10진수로 변환

 

  • 예를 들어, 1워드가 1바이트(=8비트)이면서 부호-1의 보수로 표현된 `11001010` 을 각 방법을 이용해 다음과 같이 10진수로 변환할 수 있다.
    • $-(2^{8-1} - 1) + (1 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 1 × 2^{1} + 0 × 2^{0})$
      $= -127 + (64 + 0 + 0 + 8 + 0 + 2 + 0) = -53$
    • ② `11001010` 에 대한 1의 보수 : `10110101` (최상위 비트가 1이므로 음수)
      $10110101 = -(0 × 2^{6} + 1 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 0 × 2^{1} + 1 × 2^{0})$
      $= -(0 + 32 + 16 + 0 + 4 + 0 + 1) = -53$

 

예제 : 1워드가 1바이트일 때, 다음과 같이 부호-1의 보수로 표현한 값을 10진수로 변환하라.

(a) `11101001`

(b) `00000111`

 

(a)

최상위 비트가 1으로 음수이므로, 다음과 같이 2가지 방법을 이용하여 10진수로 변환할 수 있다.

 

$-(2^{8-1} - 1) + (1 × 2^{6} + 1 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 0 × 2^{1} + 1 × 2^{0}) = -127 + (64 + 32 + 0 + 8 + 0 + 0 + 1) = -22$
② `11101001` 에 대한 1의 보수 : `10010110` (최상위 비트가 1이므로 음수)
$10010110 = -(0 × 2^{6} + 0 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 0 × 2^{0}) = -(0 + 0 + 16 + 0 + 4 + 2 + 0) = -22$

 

따라서 `10010110` 을 10진수로 변환하면 `-22` 이다.

 

(b)

최상위 비트가 0으로 양수이므로 바로 10진수로 변환할 수 있다.

 

$00000111= -(0 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0}) = 0 + 0 + 0 + 0 + 4 + 2 + 1 = 7$

 

따라서 `00000111` 을 10진수로 변환하면 `7` 이다.

 

부호-2의 보수로 표현한 값의 10진수 변환

  • 부호-2의 보수로 표현한 값을 10진수로 변환하는 방법은 다음 2가지가 있다. 두 방법 중 하나를 선택하여 구하면 된다.
① $-2^{n-1}$ + (데이터 비트의 10진수 표현)
2의 보수 표현의 데이터 비트 부분을 다시 2의 보수로 변환한 후, 이를 10진수로 변환

 

  • 예를 들어, 1워드가 1바이트(=8비트)이면서 부호-2의 보수로 표현된 `11001011` 을 각 방법을 이용해 다음과 같이 10진수로 변환할 수 있다.
    •  $-2^{8-1} + (1 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 1 × 2^{1} + 1 × 2^{0})$
      $= -128 + (64 + 0 + 0 + 8 + 0 + 2 + 1) = -53$
    • ② `11001011` 에 대한 2의 보수 : `10110101` (최상위 비트가 1이므로 음수)
      $10110101 = -(0 × 2^{6} + 1 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 0 × 2^{1} + 1 × 2^{0})$
      $= -(0 + 32 + 16 + 0 + 4 + 0 + 1) = -53$

 

예제 : 1워드가 1바이트일 때, 다음과 같이 부호-2의 보수로 표현한 값을 10진수로 변환하라.

(a) `10001001`

(b) `01110111`

 

(a)

최상위 비트가 1으로 음수이므로, 다음과 같이 2가지 방법을 이용하여 10진수로 변환할 수 있다.

 

① $-2^{8-1} + (0 × 2^{6} + 0 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 0 × 2^{2} + 0 × 2^{1} + 1 × 2^{0}) = -128 + (0 + 0 + 0 + 8 + 0 + 0 + 1) = -119$
② `01110111` 에 대한 2의 보수 : `11110111` (최상위 비트가 1이므로 음수)
$11110111= -(1 × 2^{6} + 1 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0}) = -(64 + 32 + 16 + 0 + 4 + 2 + 1) = -119$ 

 

따라서 `11110111` 을 10진수로 변환하면 `-119` 이다.

(2의 보수로 표현된 값에 다시 2의 보수를 취해주면, 원래의 절댓값으로 돌아온다.)

 

(b)

최상위 비트가 0으로 양수이므로 바로 10진수로 변환할 수 있다.

 

$01110111= 1 × 2^{6} + 1 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0} = 64 + 32 + 16 + 0 + 4 + 2 + 1 = 119$

 

따라서 `01110111` 을 10진수로 변환하면 `119` 이다.

 

보수의 연산

  • 부호-2의 보수연산도 정확하고 0에 대한 표현도 한 가지라서 컴퓨터에서는 2의 보수를 이용해 표현하고 연산한다.
  • 그리고 부호-1의 보수는 0에 대한 표현이 통일되지 않지만, 연산은 정확하다.
  • 그러므로 이 2가지 표현을 이용하여 연산하는 방법을 알아본다.

 

보수 연산 시 발생하는 초과를 처리하는 방법

- 부호-절댓값 표현 : 발생하는 초과를 무시한다.
- 부호-1의 보수 표현 : 발생한 초과를 1차적으로 구한 결과에 더한다.
- 부호-2의 보수 표현 : 발생하는 초과를 무시한다.

 

  • 각 표현의 연산 결과는 그 표현 방식을 따른다.
    • 부호-1의 보수 표현으로 연산하면, 그 결과는 부호-1의 보수 표현이다.
    • 부호-2의 보수 표현으로 연산하면, 그 결과는 부호-2의 보수 표현이다.

 

예 : 1워드가 1바이트일 때, $-15_{10} - 66_{10} = (-15)_{10} + (-66)_{10}$ 을 구해보자.
  • `|15_{10}| = 1111` 이고, `|66_{10}| = 1000010` 이며, 부호-절댓값 표현은 각각 `-15_{10} = 10001111`, `-66_{10} = 11000010` 이다. 
  • 이를 토대로 부호-1의 보수부호-2의 보수를 연산하면 다음과 같다.

 

  • 부호-1의 보수 연산의 최종 결과인 `10101110` 은 부호-1의 보수 표현이고, 부호-2의 보수 연산의 최종 결과인 `10101111` 은 부호-2의 보수 표현이다. 
    • 부호-1의 보수 연산의 결과 `10101110` 을 10진수로 변환하면 다음과 같다.
      •  $-(2^{8-1} - 1) + (0 × 2^{6} + 1 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 0 × 2^{0})$
        $= -127 + (0 + 32 + 0 + 8 + 4 + 2 + 0) = -81$
      • ② `10101110` 에 대한 1의 보수 : `11010001`
        $11010001 = -(1 × 2^{6} + 0 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 0 × 2^{2} + 0 × 2^{1} + 1 × 2^{0})$
        $= -(64 + 0 + 16 + 0 + 0 + 0 + 1) = -81$
    • 부호-2의 보수 연산의 결과 `10101111` 을 10진수로 변환하면 다음과 같다.
      • $-2^{8-1} + (0 × 2^{6} + 1 × 2^{5} + 0 × 2^{4} + 1 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0}) $
        $= -128 + (0 + 32 + 0 + 8 + 4 + 2 + 1) = -81$
      • ② `10101111` 에 대한 2의 보수 : `11010001`
        • $11010001= -(1 × 2^{6} + 0 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 0 × 2^{2} + 0 × 2^{1} + 1 × 2^{0})$
          $= -(64 + 0 + 16 + 0 + 0 + 0 + 1) = -81$

 

예제 1 : 1워드가 1바이트 일 때, 부호-1의 보수를 이용하여 다음을 연산하라.

(a) $100_{10} + 13_{10}$

(b) $100_{10} - 13_{10}$

(c) $-100_{10} + 13_{10}$

(d) $-100_{10} - 13_{10}$

 

pf)

$100_{10} = 1100100, \; |13_{10}| = 1101$ 이고, 각 수에 대한 부호-절댓값 표현부호-1의 보수 표현은 다음과 같다.

(a) (b)
(c) (d)

 

예제 2 : 1워드가 1바이트 일 때, 부호-2의 보수를 이용하여 다음을 연산하라.

(a) $100_{10} + 13_{10}$

(b) $100_{10} - 13_{10}$

(c) $-100_{10} + 13_{10}$

(d) $-100_{10} - 13_{10}$

 

pf)

$100_{10} = 1100100, \; |13_{10}| = 1101$ 이고, 각 수에 대한 부호-절댓값 표현부호-2의 보수 표현은 다음과 같다.

(a) (b)
(c) (d)

 

 

728x90

'Mathematics > 이산 수학' 카테고리의 다른 글

[이산 수학] 합성 명제  (0) 2022.10.02
[이산 수학] 조건 명제  (0) 2022.10.02
[이산 수학] 논리 연산자  (0) 2022.10.02
[이산 수학] 명제  (0) 2022.10.02
[이산 수학] 진법별 사칙연산  (0) 2022.09.26
[이산 수학] 진법 간 변환  (0) 2022.09.20
[이산 수학] 진법별 표현  (0) 2022.09.20
[이산 수학] 수의 연산  (0) 2022.09.19