다른 글에서 볼 수 있듯이 음수를 표현하는 방법에는 3가지가 있는데 대부분의 구현에서 2의 보수 표현을 쓰는 이유가 아래에 설명된 뺄셈 연산의 간단함에 있다.
이제 3가지 음수 표현 방법을 사용해서 뺄셈 연산을 해보자.
1. 부호 표현 방법
1 = 0001
-1 = 1001
1 + (-1) = 0
0001 + 1001 = 1010
-1 = 1001
1 + (-1) = 0
0001 + 1001 = 1010
위의 예에서 볼 수 있듯이 결과가 0이 나와야 하는데 이상한 값이 나오는 문제가 발생한다. 이 문제를 해결하기 위해 나온 방법이 1의 보수 표현이다.
2. 1의 보수 표현 방법
1 = 0001
-1 = 1110
1 + (-1) = 0
0001 + 1110 = 1111
-1 = 1110
1 + (-1) = 0
0001 + 1110 = 1111
그런데 위의 결과도 좀 이상하다. 이런 결과가 나오는 이유는 1의 보수 표현에서는 아래와 같이 두 개의 0을 가지기 때문이다.
0000 = 0
1111 = 0
1111 = 0
그리고 1의 보수 표현에서는 덧셈 과정에서 carry가 발생한 경우 이것도 연산을 해줘야하는 불편함이 있다. 예를 들어 5 - 2의 계산 과정은 아래와 같이 진행된다.
5 = 0101
2 = 0010
-2의 1의 보수 표현은 1101이다. 따라서 아래와 같이 계산된다.
0101 + 1101 = 0010
2 = 0010
-2의 1의 보수 표현은 1101이다. 따라서 아래와 같이 계산된다.
0101 + 1101 = 0010
답은 3이 나와야 하는데 2가 나왔다. 그 이유는 덧셈 과정에서 carry(자리 올림)이 발생했기 때문이다. 따라서 이런 경우에는 결과값에 다시 1을 더해줘야 정상적인 결과값을 얻을 수 있다.
3. 2의 보수 표현 방법
1 = 0001
-1 = 1111
1 + (-1) = 0
0001 + 1111 = 0000
-1 = 1111
1 + (-1) = 0
0001 + 1111 = 0000
2의 보수 표현에서는 정확하게 원하는 결과가 나왔다. 하지만 자세히보면 위의 덧셈에서도 carry가 발생해서 실제 결과는 10000이 나오는것인데, 2의 보수 표현에서는 carry가 발생하더라도 무시하기 때문에 이런 결과가 나오는 것이다. 이런 편리하 때문에 대부분의 구현에서 2의 보수 표현을 사용한다.
<관련 글>
유부호 정수형의 음수 표현 방법: http://superkkt.com/286
무부호 정수형의 모듈로 연산: http://superkkt.com/285

comments
comments rss (+댓글 쓰러가기)