음의 정수의 표현, 보수법

Short Articles 2012. 2. 27. 10:43
전 전공이 전자계열, 컴공이나 소프트웨어 계열쪽이 아니라 가끔 이런 기초적인 부분들을 찾아 보곤합니다.
관련 학과를 졸업하신 분들이야 이미 알고 계실 부분이고,
조금만 검색해보면 다 나오는 내용이지만 그래도 간략히 다시 포스팅을 정리해 봅니다.


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 의 표현



이렇게 함으로써 얻게된 잇점은

  • 0 에 대한 표현이 하나로 줄어들고 해당 비트 영역에서 표현 가능한 수가 1 늘어 납니다.
  • 캐리를 신경쓰지 않아도 됩니다.
  • 음수의 뺄셈을 감산기를 이용하지 않고 덧셈으로 처리할 수 있습니다.


'Short Articles' 카테고리의 다른 글

Class Template  (0) 2012.04.07
Function Template  (0) 2012.03.31
C++ Template, Expression Templates #4  (2) 2012.02.22
C++ Template, Expression Templates #3  (0) 2012.02.21
C++ Template, Expression Templates #2  (0) 2012.02.17
: