201303/보수/1의보수와 2의보수

2013. 4. 3. 16:34프로그래밍/C언어 TIP

◎ 보수(Complement)

보수를 알기에 앞서 보수방식의 발전을 가져온 것이 바로 signed-magnitude(부호 절대값)방식이다. 부호 절대값 방식은 가장 쉽게 생각할 수 있는 방식이다. MSB(최상위비트)을 부호비트(0이면 양수, 1이면 음수)로 사용하고, 나머지는 절대값을 표현한다. 8비트 정수를 예로 들면,

  0000 0000 

+0

1000 0000

-0

0000 0001

1

1000 0001

-1

0000 0010

2

1000 0010

-2

0000 0011

3

1000 0011

-3

0000 0100

4

1000 0100

-4

0000 0101

5

1000 0101

-5

0000 0110

6

1000 0110

-6

0000 0111

7

1000 0111

-7

위와 같이 표현할 수 있다. 하지만 문제점이 있다. 우선 0이 (+0과 -0)두 개 존재한다. 그리고 더욱 큰 문제는 덧셈과 뺄셈을 할 때 이다. +4 +(-4)의 경우 0000 0100 + 1000 0100 이 된다. 계산해보면 1000 1000이 나오는데 결과는 0이 아니라 -8이 된다. 매그니큐드 방식은 컴퓨터에서 부호로는 표현이 되지만 산술이 어렵다는 이유로 컴퓨터는 다른 방식을 사용한다. 그것이 바로 보수방식.

․ 1의 보수

1의 보수 방식은 부호 절대값 방식에서 단순히 음수의 순서를 뒤집은 것이다. 비트를 반전시키면 부호가 바뀌게 된다. 다행히 비트반전은 쉽게 구현할 수 있다. 그리고 MSB가 0이면 양수, 1이면 음수라는 성질은 그대로 유지된다.

0000 0000 

+0

1111 1000

0000 0001

1

1111 1001

0000 0010

2

1111 1101

0000 0011

3

1111 1100

0000 0100

4

1111 1011

0000 0101

5

1111 1010

0000 0110

6

1111 1001

0000 0111

7

1111 1000

하지만 여전히 0이 두 개인 것과 캐리를 처리해야 하는 문제가 남아있다.

 ․ 2의 보수

부호 절대값 방식의 문제였던 -0 문제와 캐리를 처리해야 하는 문제가 사라진다. 2의 보수 방식에서는 부호를 바꾸려면 비트를 반전한 다음 LSB에 1을 더하면 된다.

수직선의 원리를 도입한다. 8비트의 정수를 예로 들면, 0 ~ 127까지를 양수(+)로 보고 128 ~ 255까지를 음수(-)로 생각한다. -128에서부터 +127까지 표현이 가능하게 된다. 여기서 255를 2진수로 1111 1111이 된다. 하지만 -1로 읽는다. 그 이유는 2진수 0000 0001를 1의 보수로 취하면 1111 1110이 되고 거기에 최하위 비트에 1을 더하면 1111 1111이 되는 것이다. 정수로 표현하면 255가 되지만 보수방식에 따라

-1이 되는 것이다. 예를 들어, +1 + (-2)를 계산해 보면 0000 0001 + 1111 1110이 된다. 1111 1110은 10진수 2를 2의 보수로 취한 것이다. 결과를 보면 1111 1111이 되고 10진수로 -1이 되는 것이다. 컴퓨터는 내부적으로 보수회로가 존재하고 보수방식은 매그니큐드 방식과 마찬가지로 첫 번째 자리 비트로 부호를 알 수 있다.

  

 

◎ char 함수와 대입연산자(=)

char함수는 메모리에 1byte를 할당해주도록 하는 C언어 명령어이다.

char = cNum; 이라고 적어주면 cpu는 메모리에 cNum이라는 이름의 1byte 공간을 만든다. 아래 줄에 cNum = 100; 이라고 적어주면 cpu는 다시 cNum에 100을 저장하게 된다. printf("%d\n",cNum); 을 적으면 printf문으로 cNum을 호출하면 cpu가 연결된 모니터로 메모리에 cNum에 저장된 100을 출력하게 되는 것이다. 가장 중요한 건

char는 1byte의 메모리를 할당하기 위해 사용한다는 것이다.

 

대입연산자(=)는 위의 cNum = 100; 을 봤을 때, 수학의 기호처럼 같다의 의미가 아니라 오른쪽에 있는 100의 값을 cNum에 대입하라는 명령어로 사용됐다.

  

◎ 오늘의 실습 예제

char함수와 대입연산자를 이용하여 화면에 숫자를 출력하기

#include <stdio.h>

 

int main()

{

        char cNum;

        cNum = 100;

        printf("%d\n",cNum);

        cNum = cNum+1;

        printf("%d\n",cNum);

          

      return 0;

}

  결과화면