본문 바로가기
프로그래밍/이산 수학

보수 - 10, 9, 2, 1의 보수

by 3.14pie 2022. 12. 29.

보수(Complement) - 보충을 해주는 수, 숫자의 합이 일정 수가 될 수 있도록 도와주는 수

N진법에는 N의 보수, N-1의 보수가 있다.

 

10의 보수 - 10이 되기 위해 필요한 수 (ex. 2의 10의 보수는 8, 7의 10의 보수는 3, 12의 10의 보수는 88), 10^n이 되기 위해 필요한 수

9의 보수 - 9가 되기 위해 필요한 수, 각 자리별 9와의 차이로 얻는 수, 10^n - 1이 되기 위해 필요한 수

큰 수의 경우 먼저 9의 보수를 구한 후 1을 더하면 10의 보수가 된다.

 

4자리만 표현 가능할 때

540 - 8 = 0540 -0008 = 0540 - 0008 + 10000 - 10000 = 540 + 9992 - 10000 = 10532 - 10000 (여기서 4자리만 표현 가능하니까 첫번째 자리인 1은 표현이 X) = 532 - 0000 -> 0을 뺄 필요가 없어짐, 첫번째 자리인 1이 오버플로우

 

오버플로우를 사용하면 뺄 필요가 없어지니 빼려는 수의 보수만 구할 수 있다면 덧셈만으로 뺄셈이 가능하게 된다.

15 - 4 = 015 + 996 = 1011 -> 오버플로우 제거하면 = 011

즉, -4 = 996(음수=보수)과 동일하다고 볼 수 있다.

 

1의 보수 - n자리수를 가진 2진수 n+ (n의 1의 보수) = 2^n -1, 2진수에서는 1이 가장 큰 숫자

1011 + 1011의 1의 보수 = 1011 + 0100 = 1111

 

N의 1의 보수 = 2^n -1 -N (N의 비트를 뒤집은 것과 같음)

N = 1001

2^4 - 1 = 10000 - 1 = 1111, 1111- 1001 = 0110

 

1의 보수를 통해 나타낼 수 있는 수의 범위 = -127 ~ -0, +0 ~ +127

-> 0이 +0, -0이 존재하고, 뺄셈 시 오버플로우가 발생해 모든 자리수가 0이 될 경우(2+(-1))에 1을 더해줘야 한다.

 

2의 보수 - n자리수를 가진 2진수 N의 2의 보수는 2^n - N

N = 1001

2^4 - 1001 = 10000 - 1001 = 0111 = 1의 보수를 구하고(0110) 1을 더한 값과 같음

 

2의 보수를 통해 나타낼 수 있는 수의 범위 = -128 ~ -1, 0 ~ 127

-> 0이 하나이고, 음수를 처리할 때 1을 더해줄 필요가 없다.

 

-> 해당 범위를 넘어가는 결과 값이 나올 경우에 오버플로우가 발생해 정상적인 값이 나오지 않는다.

 

언더 플로우 - 표현할 수 있는 최소값보다 작은 값이 나올 때 발생한다. (부호있는 경우는 -128, 없는 경우는 0) 언더 플로우가 발생하면 최대값부터 다시 시작한다.