Posts 이산수학 #9,10강: 보수의 표현 및 연산
Post
Cancel

이산수학 #9,10강: 보수의 표현 및 연산

보수의 표현

  • 3에 대한 7의 보수: 3 + n = 7 ∴ n=4

1의 보수(1’ complement) 표현

  • 어떤 수 n과의 합이 1이 되는 수 (각 자리별로 합해서 1이 되는 수)
    • 예: 2진수 00110101의 1의 보수 = 11001010

2의 보수(2’ complement) 표현

  • 어떤 수 n과의 합이 2가 되는 수
    • 예: 00110101~2~의 2의 보수 = 11001011
1
2
3
4
5
/*
00110101
구하는 방법 (1)
11001010(1의 보수) + 1 => 11001011
*/

컴퓨터에서의 데이터 표현

부호화-절대치 표현

  • 부호와 데이터의 절댓값을 그대로 표현

image

예제 4-28. 10진수 +53과 -53에 대하여 8bit 부호화-절대치 표현으로 나타내시오.

  • 53~10~ = 00110101~2~
  • -53~10~ = 10110101~2~

1의 보수 / 2의 보수 표현의 특징

공통점

  • 음수 표현에만 적용
  • 음수에 대한 부호화-절대치 표현에서 부호 비트는 그대로 사용

차이점

  • 음수에 대한 부호화-절대치 표현에서 절대치 비트(데이터 비트)에 대해
    • 1의 보수(0은 1로, 1은 0으로)로 바꿈
    • 2의 보수(1의 보수에 1을 더함)로 바꿈

컴퓨터는 덧셈 연산은 가능하나 뺄셈연산은 덧셈으로 변환해서 계산해야 하기 때문에 보수라는 개념이 생겼다. 예를 들면, A - B를 A + (B의 보수) 형태로 계산할 수 있다. 1의 보수는 2진수의 0과 1을 모두 바꿔준다. 2의 보수는 1의 보수에 1을 더한다. 1의 보수 형태에서는 0이 2개 존재하므로 (+0, -0) 혼란을 줄 수 있다.

2 - 4 = 2 + (-4)

예제. +53과 -53의 8bit 1의 보수/2의 보수 표현

  • 53은 양수이기 때문에 부호화-절대치 표현과 동일 ∴ 00110101
  • -53은 부호 비트를 제외한 7bit 데이터 비트는 0110101~2~ 이므로
1
2
3
4
 부호화-절대치 표현: 00110101
 1의 보수 표현     : 11001010
                   +        1
 2의 보수 표현     : 11001011

데이터의 범위

image

  • n비트를 사용하는 컴퓨터에서
    • 1의 보수: -(2^n-1^-1) ~ (2^n-1^-1)
    • 2의 보수: -2^n-1^ ~ (2^n-1^-1)
  • 부호비트는 제외하여 실질적으로 7비트를 사용하기 때문에 2^n^이 아니라 2^n-1^이어야 한다.
    • 1의 보수는 그대로 대칭된다. 따라서 제일 작은 숫자와 제일 큰 숫자도 대칭된다.
    • 반면 2의 보수는 제일 작은 숫자가 제일 큰 숫자보다 절대값이 하나 더 크다.
  • 연산 결과가 데이터의 범위를 벗어나는 경우를 초과(overflow)라고 하며 다음 2가지 경우에 발생
    • 두 개의 양수를 더했을 때 음수가 나오는 경우
    • 두 개의 음수를 더했을 때 양수가 나오는 경우

예제. 4bit 부호화-절대치 표현에서

  • 4~10~ + 5~10~ = 0100~2~ + 0101~2~ = 1001~2~ = -1~10~ != 9~10~
  • (-3) + (-4) = 1011 + 1100 = 10111 = 7 != -7

보수 표현을 사용하는 이유

부호화-절대치 표현의 한계

  • 연산의 결과가 부정확: 초과 발생 시
    • 예: 4bit에서 연산: 4+5, (-3) + (-4)
    • 0에 대한 2가지 표현: 0000(+0), 1000(-0)

1의 보수 표현의 한계

  • 연산의 정확성
  • 0에 대한 2가지 표현: 0000(+0), 1111(-0)

2진법에서 1에 보수를 사용하는 것은 10진법에서 9진법을 사용하는 것과 같다. 10진법에서는 10의 보수를 쓰는 것이 맞다. 더해서 자릿수가 넘어가는 것은 10을 초과하는 것이고, 자리를 빌려오는 것은 10을 빌려 오는 것이다. 10개를 빌려와서 9의 보수로 하면 9개만 쓰고 한 개는 버린다는 얘기다. 또는 9개만 쓰고 나중에 10을 채워서 자릿수가 넘어가야 한다. 즉 항상 1이라는 숫자가 문제가 된다. 즉 진법하고 보수가 같은 숫자를 써야 한다. 1의 보수는 간편하지만, 연산에서 문제가 생길 수 있다.

2의 보수 표현에서 위의 2가지 문제 모두 해결

  • 연산의 정확성, 0에 대한 유일한 표현

보수의 10진수 변환

image

  • 1의 보수(2의 보수)를 10진수로 변환하는 방법

    • 방법1: -(2^n-1^-1)(-2^n^-1)+절대치 비트의 10진수 표현
      • 제일 작은 수에서 절대치 비트의 10진수 표현(offset)만큼 더해준다.
    • 방법2: 1의 보수(2의 보수)를 다시 1의 보수(2의 보수)로 변환한 후 이에 대해 10진수 표현

    !(!p)가 p인 것처럼

예제. 4bit 컴퓨터에서 다음을 10진수로 변환

  • -1의 보수 1010
    • ① -(2^4-1^-1)+(1×2^1^)=-5
    • ② 1101^2^=-(1×2^2^+1×2^0^)=-5
  • 2의 보수 1011
    • ① -(24-1)+(1×21+1×20)=-5
    • ② 11012=-(1×22+1×20)=-5

image

예제. 4bit 컴퓨터에서 2~10~ - 4~10~에 대해 1의 보수와 2의 보수를 이용하여 연산하시오.

2~10~=0010,4~10~=0100
1
2
3
4
5
6
7
8
9
10
11
// 1')
// 0100
//+1011
//------
// 1101

// 2')
// 0010
//+1100
//-----
// 1110
  • 1의 보수 이용: 1101~2~ -> 1010~2~ = -2~10~
  • 2의 보수 이용: 1110~2~ -> 1010~2~ = -2~10~

예제. 4bit 컴퓨터에서 410-210에 대해 1의 보수와 2의 보수를 이용하여 연산하시오

4~10~=0100,2~10~=0010
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1')
//  0100
//+ 1101
//------
// 10001
//+    1
//------
//  0010

// 2')
//  0100
//+ 1110
//------
// 10010
// (무시)
  • 1의 보수 이용: 0010~2~=2~10~
  • 2의 보수 이용: 0010~2~=2~10~

예제. 4bit 컴퓨터에서 -210-410에 대해 1의 보수와 2의 보수를 이용하여 연산하시오

2~10~=0010,4~10~=0100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
1')
  1101
+ 1011
------
 11000
   + 1
------
  1001
/*

/*
2')
  1110
+ 1100
------
 11010
 (무시)
*/
  • 1의 보수 이용: 1001~2~ → 1110=-6~10~
  • 2의 보수 이용: 1010~2~ → 1110=-6~10~

10진수 10의 보수: x - y = x + (10 - y) - 10

10진수 9의 보수: x - y = x + (9 - y) - 10 + 1

1의 보수는 간편하다. 하드웨어 로직을 꾸밀 때도 간단하다.

1의 보수는 최소치에서 보수의 부호 부분을 뺀 절대치를 더한 것이다. 이것이 offset이다.

This post is licensed under CC BY 4.0 by the author.

Do it! 자료구조와 함께 배우는 알고리즘 #3장: 검색 (검색 알고리즘, 선형 검색, 이진 검색)

핵심 자료구조와 알고리즘 #3장: ArrayList 클래스

Loading comments from Disqus ...