컴퓨터는 연산할 때, 2진수로 수를 표현하고 뺄셈을 못하기 때문에 가산기를 통해 더하게 됩니다. 저번 시간에 덧셈, 뺄셈, 곱셈, 나눗셈을 배웠는데요, 사실 곱셈은 여러번 더하는 것으로 표현할 수 있고, 뺄셈은 음수를 덧셈하는 것으로 표현할 수 있게 됩니다. 문제는 음수를 어떻게 표현하는지가 문제입니다. 뺄셈이 해결되면, 나눗셈은 자연스럽게 해결됩니다. 나눗셈은 여러번의 뺄셈을 하는 것이므로 여러번의 음수를 더하는 것으로 생각할 수 있겠습니다.
다만 기존의 방식대로 하면,
음수를 표현할 수 없게 됩니다.
음수는 어떻게 표현하면 될까요?
음수를 표현하는 총 3가지를 알아보겠습니다.
미리 스포를 하자면,
1. 부호 및 크기 방식 (Sign and magnitude) -> 간단하지만 연산의 문제가 있음.
2. 1의 보수 (1's complement) -> 간단하지만 carry를 고려해야함. +0과 -0이 따로 발생함.
3. 2의 보수 (2's complement) -> 위 방법들의 단점들을 해결
참고로 보수는 n의 보수와 n-1의 보수가 있습니다. 해당 글은 2진법을 다루고 있으므로 1의 보수와 2의 보수가 해당됩니다.
1. 부호 및 크기 방식 (Sign and magnitude)
보수를 배우기 앞서 가장 간단한 접근법을 알아봅시다.
비트 하나를 부호를 표현하는 것으로 할당하는 방법입니다.
이때 맨 왼쪽의 비트를 이용하게 되는데, 이 최상위 비트를 MSB(Most Significant Bit)라고 부릅니다.
문제는 덧셈했을 때 저희가 원하는 값이 나오지 않는다는 것입니다. 양수끼리 더했을 때에는 문제가 없지만, 음수가 끼는 순간부터 덧셈 결과값이 저희가 원하는 값이 나오지 않는 것을 확인할 수 있습니다.
결국 이 방식은 MSB만 고려해주면 되서 간편한 방법이지만, 연산에서는 단순히 더하는 방법으로 할 수 없기 때문에 MSB가 무엇이냐에 따라 복잡한 문제가 생기게 됩니다.
2. 1의 보수 (1's complement)
이전의 부호 및 크기 방식의 문제가된 연산을 해결하기 위해 보수의 개념이 필요합니다.
보수는 가산기로 뺄셈을 덧셈으로 하기 위한 개념으로, 어떤 수를 만들기 위한 '보충해주는 수' 입니다.
1의 보수는 어떤 값들로 되어 있는지 아래 그림을 통해 감을 잡아봅시다.
즉, 양수의 모든 비트를 반전만 하면 되는 간단한 방법을 취하고 있습니다. 하지만 +0과 -0을 구분하는 문제점이 생기게 됩니다.
그리고 1의 보수에서도 연산에서 고려해야하는 부분이 발생하게 됩니다.
바로 carry(올림)가 발생하게 되는 것입니다. 비트를 넘어가는 overflow가 발생하면 그 결과 값에 1을 더해줘야 하는데요, 이 추가적인 보정 단계는 연산을 복잡하게 만듭니다. 아래 예시들을 통해서 이해해봅시다.
아래 예시는 1의 보수 체계를 이용한 덧셈입니다.
다음 예시는 carry가 발생한 예시입니다.
이처럼 비트를 넘어가게 되면 따로 1을 더해줘야하는 연산 과정을 거쳐야 합니다.
문제는 다음 예시입니다. 보수 연산에서는 결과 값이 일정 값을 넘어가게 되면 연산을 고려하더라도 잘못된 값이 나옵니다. 이건 물론 2의 보수에서도 마찬가지로 발생하게 됩니다.
3. 2의 보수(2's complement)
1의 보수에서는 +0과 -0을 구분지었는데요, 이것을 간단하게 해결하기 위해 1의 보수 방식에서 +1을 해주면 됩니다. 이것이 2의 보수 방법입니다. 1의 보수와 관련성을 만들면 비트를 반전시키고 1을 더하면 됩니다.
예시로 보겠습니다.
carry가 생겼지만, 1을 단순히 무시해준다면 저희가 원하는 정답이 나오게 됩니다. 이전의 1의 보수 방식처럼 1을 따로 더해주지 않아도 됩니다.
2의 보수는 1의 보수의 문제점을 해결했습니다.
다만, 2의 보수 연산도 마찬가지로 위의 예제는 문제가 없지만 연산 값이 -8을 넘어가게 되는 순간부터 값이 결과 값이 잘못되는 문제가 발생합니다.
'Computer Science > 디지털논리회로' 카테고리의 다른 글
[논리회로] 2강 - 2진법 계산 방법 (덧셈 뺄셈 곱셈 나눗셈) (0) | 2023.09.10 |
---|---|
[논리회로] 1강 - 디지털 수 체계와 변환 1 (디지털 시스템 2진수 10진수) (0) | 2023.09.08 |