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 의 표현
'C언어 & 파이썬 > C언어' 카테고리의 다른 글
부동 소수점 오차 예제. (0) | 2012.11.13 |
---|---|
음의 정수, 양의정수 표현하기 문제. (0) | 2012.11.12 |
10진수 16진수 8진수를 이용한 덧셈 뺄셈연산. (0) | 2012.11.12 |
byte를 10진수로(이해도움을 위한 글) (0) | 2012.11.12 |
진수와 비트, 비트바이트정리. (0) | 2012.11.09 |