컴퓨터에서는 음수를 표현하기 위해서 2의 보수를 사용한다. 이건 고등학교 때 배웠었고 이해하고 있다고 생각했었는데, 최근 다시 접하니 잘 모르거나 애매한 부분이 꽤 있었다. 그래서 보수에 대한 개념부터 2의 보수를 사용해 뺄셈을 하고 음수를 표현하는 방식에 대해 정리해보려고 한다.
보수란?
보수(complement)란 각 자리의 숫자의 합이 어느 일정한 수가 되게 하는 수를 뜻한다. 이를 일반화하면 'x에 대한 (x+k)에 대한 보수는 k'라고 할 수 있다.
Ex1) 십진수 4의 10의 보수는 6
Ex2) 십진수 11의 15의 보수는 4
이해를 돕기 위해서 우리가 일상적으로 사용하는 10진수를 예시로 들어 먼저 설명해보자.
9의 보수
각 자리의 숫자의 합이 9가 되게 하는 수이다. 10진수 258의 9의 보수는 999 - 258 = 741이다.
10의 보수
숫자의 합이 10의 제곱이 되게 하는 수이다. 10진수 258의 10의 보수는 1000 - 258 = 742이다. 즉, 9의 보수에서 +1을 한 것과 같다.
그럼 이 보수를 이용하여 뺄셈을 해보자.
Ex1) 500 - 258 계산
1) 컴퓨터에서는 가산만 가능하기 때문에 그에 맞게 형태를 취해준다.
500 + (-258)
2) 감수의 보수를 취해준다.
999 - 258 + 1 = 742
3) 두 수를 더한다.
500 + 742 = 1242
4) 올림수(carry)가 나오면 버리고 그렇지 않다면 결과값이 음수이므로 보수를 취해주고 마이너스 부호를 붙혀준다.
1242에서 천의 자리수 1은 올림수이므로 버린다. => 242
5) 따라서 결과값은 242이다.
만약 결과값이 마이너스라면 어떻게 될까?
Ex2) 100 - 258 계산
1) 100 + (-258)
2) 999 - 258 + 1 = 742
3) 100 + 742 = 842
4) 올림수가 생기지 않았기 때문에 결과값은 음수임을 알 수 있음. 따라서 10의 보수를 취해준다.
842의 10의 보수 => 999 - 842 + 1 = 158
5) 따라서 결과값은 -158이다.
1의 보수
각 자리의 숫자의 합이 1이 되게 하는 수이다. 2진수에서는 반전을 해줘서 구할 수 있다.
Ex) 이진수 1011의 1의 보수는 0100
2의 보수
어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수이다. 1의 보수를 취해주고 1을 더한 것과 같다.
Ex) 이진수 1011의 2의 보수
10000
-) 1011
-------------
0101
OR
1011의 1의 보수 => 0100
0100 + 1 = 0101
2의 보수를 이용한 뺄셈을 하는 방법은 위에서 했던 10의 보수를 이용한 뺄셈과 똑같다.
Ex1) 0001 1111 0100 - 0001 0000 0010 (500 - 258)
1) 컴퓨터에서는 가산만 가능하기 때문에 그에 맞게 형태를 취해준다.
0001 1111 0100 + (-0001 0000 0010)
2) 감수의 보수를 취해준다.
0001 0000 0010의 2의 보수 => 1110 1111 1110
3) 두 수를 더한다.
0001 1111 0100 + 1110 1111 1110 = 1 0000 1111 0010
4) 올림수(carry)가 나오면 버리고 그렇지 않다면 결과값이 음수이므로 보수를 취해주고 마이너스 부호를 붙혀준다.
5) 따라서 결과값은 0000 1111 0010이고 10진수로는 242이다.
Ex2) 0000 0110 0100 - 0001 0000 0010 (100 - 258)
1) 0000 0110 0100 + (-0001 0000 0010)
2) 0001 0000 0010의 2의 보수 => 1110 1111 1110
3) 0000 0110 0100 + 1110 1111 1110 = 1111 0110 0010
4) carry가 생기지 않음 => 결과값이 음수이므로 보수를 취해주고 마이너스 부호를 붙힌다.
0000 0000 1001 1110에서 음수를 표현하기 위해 최상위 비트를 1로 바꾸어준다.(데이터를 16bit에 저장한다고 가정)
5) 따라서 결과값은 1000 0000 1001 1110이고 10진수로 변환하면 -158이다.
참고링크
[컴퓨터 구조] 10의 보수 2의 보수, 보수에 관해 1
논리회로 보수의 모든 것 (10의 보수, 9의 보수, 2의 보수, 1의 보수, 보수를 쓰는 이유, 보수를 이용한 뺄셈)