C언어 & 파이썬/C언어 2012. 11. 12. 07:29

2의 보수법.

출처 http://gcstudy.tistory.com/16


1. 처음 2진수로 음의 정수를 표현하고자 했던 방식은 최상위 비트를 부호 비트로 두는 것이었습니다.
(최상위 비트가 1 이면 음수, 0 이면 양수)



그림과 같이 +1 과 -1 은 최상위 비트가 0 과 1 로 구별됩니다.

이 방식의 문제점은 0 을 표현하는 데 있어서

00000000
10000000



이렇게 +0 , -0 두 개의 표현이 나오게 된다는 것과
두 수의 부호가 같은지 다른지 등을 구별해서 가산기 로직을 탈 것인지,
감산기 로직을 탈 것인지를 판별하는 등 연산이 복잡해진다는 것입니다.
예를 들어,
(+1) + (-1) 은
0000001 + 10000001 로 표현되는데, 이것을 그대로 더하면 100000010 (-2) 라는 결과가 되버립니다.
그리고 값의 크기 비교도 부호에 따라 판별을 달리해야하는 모순이 생깁니다.
인간의 관점에서는 당연스럽지만 기계에 있어서는 일관된 법칙을 적용하기가 힘들어지는 방식입니다. 


2. 그래서 이 다음으로 나온 방식이 1의 보수법입니다.
1의 보수법에서 음수의 표현은 단순히 해당 수의 각 비트를 반전 시키는 것입니다.
 



1의 보수법은 단순히 비트를 반전시키는 것이기 때문에 부호 처리가 매우 쉬워졌습니다.
음수에 대한 비교 연산 역시 일관성을 갖게 되었습니다.

11111101 > 11111100     -2  > -3 

하지만, 1의 보수법도 여전히 0 의 표현이 두 가지로 존재하고 계산 과정에서
캐리를 감지해서 LSB(최하위 비트)에 더해주는 작업이 필요합니다.

예를 들어,
(-2) + (-3) 은 다음과 같이 되는데


이것을 그대로 사용하게 되면 -6 의 값이 되지만
캐리가 발생하였으므로 LSB 에 1을 더해서 다음과 같이 처리하게 됩니다.
(캐리 발생은 8086 계열의 CPU 의 경우 flag register 의 0번 비트를 보고 판별합니다.)


3. 1의 보수법 다음으로 1의 보수법이 가진 문제점이 개선되어 나온 것이 2의 보수법 입니다.
2의 보수법은 1의 보수를 취한 후에 단순히 1을 더해줌으로써 음수를 표현합니다.

(-2) + (-3)



0 의 표현