Github avatar

GyeongSu Han's Github Pages

2의 보수

Sep 09, 2015 · Computer Structure

예전 컴퓨터에서는 sign-magnitude1의 보수를 사용했었다.

컴퓨터에서 음수를 표시할 때, 2의 보수를 사용하여 표시한다.

현재 대부분의 컴퓨터에서 음수를 표시할 때, 2의 보수를 사용하여 표시한다.

예를들어 8bit에서 음수를 표시할 때를 살펴보겠다.

숫자 5가 있다. 이를 비트로 표시할 경우 다음과 같이 표시할 수 있다.

5: 0 0 0 0 0 1 0 1

우선 0을 1로 바꾸고 1을 0으로 바꾼다. 그렇게 할 경우

1 1 1 1 1 0 1 0

이 된다. 여기에 +1을 해주면 2의 보수로 변경이 완료된다. 음수를 양수로 바꾸는 것도 똑같이 하면 된다.

이제 프로그램을 통하여 확인을 해보겠다.

root@ubuntu:~# cat complement.c
#include <stdio.h>

int main(int argc, char* argv[]) {
    int num, bin, i;
    printf("input number : ");
    scanf("%d", &num);
    bin = *(unsigned int*)&num;
    for (i = 32; i; i--) {
        printf("%d", bin & (0x1 << (i - 1)) ? 1 : 0);
        if (i % 4 == 1 && i != 1) printf(" | ");
    }
    puts("");
    return 0;
}

입력한 숫자를 비트단위로 쪼개 출력하는 프로그램이다.

정상적으로 작동하는지 확인해 보겠다.

root@ubuntu:~# gcc -o complement complement.c
root@ubuntu:~# ./complement
input number : 256
0000 | 0000 | 0000 | 0000 | 0000 | 0001 | 0000 | 0000
root@ubuntu:~# ./complement
input number : -1
1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111

정상적으로 작동하는것 같다.

그럼 간단하게 5와 -5를 비교해 보겠다.

root@ubuntu:~# ./complement
input number : 5
0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0101
root@ubuntu:~# ./complement
input number : -5
1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1011

5는 정상적으로 출력이 되었다. -5를 2의 보수법을 이용하여 계산해 보겠다.

0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0101 = 5
1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1010
1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1011 = -5

1, 2, 3순서대로 변환을 하게되면 정상적으로 처리가 됨을 알 수 있다.

그럼 이번에는 임의로 비트를 조절해 그 값이 음수를 나타내는지 확인을 해보겠다.

root@ubuntu:~# cat check.c
#include <stdio.h>

int main(int argc, char* argv[]) {
    int num = 0xFFFFFFFB; // -5
    printf("%d\n", num);
}

임의로 -5의 값을 주었다.

root@ubuntu:~# gcc -o check check.c
root@ubuntu:~# ./check
-5

이 프로그램을 사용하여 2의 보수가 적용되었다는 것을 알 수 있다.