컴퓨터에 대해 공부하고 있는 사람이라면 컴퓨터의 CPU는 뺄셈도 덧셈으로 처리한다는 것을 알고 있을 것이다. 처음 이것을 배울때 너무 신기하다고 생각했다. 마치 1과 0만을 활용한 마법같다고 말이다.
원리는 아주 간단하다. 2의 보수라는 개념을 사용하면 된다.
사실 컴퓨터의 음수표현은 부호와 비트, 1의 보수, 2의 보수 3가지가 있는데 2의 보수를 제외한 나머지 2가지는 -0이 존재할 수 있다는 문제가 있다. 그래서 2의 보수라는 개념을 사용하여 음수를 표현한다.
예를 들어 설명하면
10에서 6을 빼는 계산을 컴퓨터 기준으로 보면
컴퓨터는 2진수 0과 1만을 사용하기 때문에
1010 - 0110
이렇게 표현할 수 있겠다. 그런데 뺄셈을 덧셈으로 처리한다는 말은 무엇을 말하는 것이냐면 1010 - 0110
을 1010 + (0110의 2의 보수값)
으로 바꿔주면 된다.
자 그럼 계산해보겠다.
1010은 그대로 두고 빼야 할 수(여기서는 0110, 10진수로는 6)를 2의 보수값으로 바꾼다.
바꾸는 방법은
1. 0110의 각 자리 수를 모두 0은 1로, 1은 0으로 바꿔준다. -> 1001
2. 바꾼 결과값 1001에 1을 더해준다. -> 1010
3. 1010 이 0110의 2의 보수값이다.
4. 즉 1010은 10진수 6의 음수표현으로 -6 인 것이다.
그러면 위에서 말한 1010 + (0110의 2의 보수값)
이 계산을 할 수 있게 되었다.
1010 + 1010
이것이다. 그런데 좀 이상하다. 2진수 1010은 10진수로 10인데
1010 이 또 나왔다. 여기서 1010이 또 나와서 이것이 왜 10진수로 10이 아니고 -6이냐고 물을 수도 있겠다. 그러나 2의보수 값 1010은 2의 보수처리 하지 않은 일반 2진수와 같다고 생각하면 안된다.
2의 보수값 1010은 음수이며, 이것의 본래 값을 알아보려면 2의 보수처리한 1010에서 반대로 처리하면 이 1010이란 값이 어떤 수를 음수로 표현한 값인지 알 수 있다.
자리값을 모두 0에서 1, 1에서 0으로 바꾸고 1을 더했기 때문에
이것을 반대로 1을 빼고 자리값을 바꾸면 어떤 수의 음수표현 값인지 알 수 있는 것이다.
반대로 처리하면 1010은 0110, 10진수로 6이 나온다. 따라서 1010은 6의 음수표현 -6인 것이다.
따라서 1010 + 1010
의 1010 2개가 같은 값이라고 오해하면 안된다. 앞의 1010은 그냥 2진수이고 뒤의 1010은 2진수를 2의 보수처리 한 값이다.
1010 + 1010
의 결과는 1 0100
이 나온다. 앞의 1은 자리올림이 일어나서 올림 한 수이다. 이렇게 자리올림이 일어나면 결과값은 양수(+)이며 올라간 수는 무시하고 0100
만 가지고 결과 값을 보면된다. 0100은 10진수로 4이므로
10 - 6 = 4 의 결과가 2진수로도 똑같이 나오는 것을 알 수 있다.
단, 위에서 마지막으로 한 2진수 + (2의 보수값) 의 결과가 자리올림이 일어나지 않은 경우에는 자리 올림이 일어나지 않은 결과값은 음수(-)이다. 따라서 자리올림이 일어나지 않은 결과값이 어떤 수의 음수인지 알아야 하기 때문에 아까 했었던 2의보수처리 방법의 반대로 한번 처리해주어야 한다.
자리 올림이 일어나지 않은 결과 값에서 1을 빼고 각 자리를 1은 0으로 0은 1로 바꾼다.
그렇게 하면 2진수 값이 나오고 그 값에 -(마이너스) 표시만 붙여주면 음수 결과 값을 볼 수 있다.
말로 설명하기가 상당히 어려운 주제이므로 그림을 그려가며 설명해야 할 것 같다. 하지만 위의 글을 자세히 읽어보면 충분히 이해할 수 있을 것이다.
다음에 그림으로 설명하는 내용을 덧붙여서 포스트를 업데이트 하도록 하겠다.
그럼 글로만 된 지루한 포스팅을 읽어 주신 모든 분들께 감사드린다는 말을 전하고 싶다.