2의 보수
Sep 09, 2015 · Computer Structure
예전 컴퓨터에서는 sign-magnitude와 1의 보수를 사용했었다.
컴퓨터에서 음수를 표시할 때, 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*)#
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의 보수가 적용되었다는 것을 알 수 있다.