컴퓨터는 연산할 때, 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)라고 부릅니다.

문제는 덧셈했을 때 저희가 원하는 값이 나오지 않는다는 것입니다. 양수끼리 더했을 때에는 문제가 없지만, 음수가 끼는 순간부터 덧셈 결과값이 저희가 원하는 값이 나오지 않는 것을 확인할 수 있습니다.

1010은 -2인데, 저희가 원하는 0이 아닙니다.

 

결국 이 방식은 MSB만 고려해주면 되서 간편한 방법이지만, 연산에서는 단순히 더하는 방법으로 할 수 없기 때문에 MSB가 무엇이냐에 따라 복잡한 문제가 생기게 됩니다. 

 

2. 1의 보수 (1's complement)

 

이전의 부호 및 크기 방식의 문제가된 연산을 해결하기 위해 보수의 개념이 필요합니다.

보수는 가산기로 뺄셈을 덧셈으로 하기 위한 개념으로, 어떤 수를 만들기 위한 '보충해주는 수' 입니다. 

 

1의 보수는 어떤 값들로 되어 있는지 아래 그림을 통해 감을 잡아봅시다.

2진수와 그 1의 보수 값을 더하면 모두 1111이 되는 것을 확인할 수 있습니다.

 

즉, 양수의 모든 비트를 반전만 하면 되는 간단한 방법을 취하고 있습니다. 하지만 +0과 -0을 구분하는 문제점이 생기게 됩니다.

 

그리고 1의 보수에서도 연산에서 고려해야하는 부분이 발생하게 됩니다.

바로 carry(올림)가 발생하게 되는 것입니다. 비트를 넘어가는 overflow가 발생하면 그 결과 값에 1을 더해줘야 하는데요, 이 추가적인 보정 단계는 연산을 복잡하게 만듭니다. 아래 예시들을 통해서 이해해봅시다.

 

미리 말하면, 2의 보수 체계에서는 발생하지 않습니다.

 

아래 예시는 1의 보수 체계를 이용한 덧셈입니다.

 

carry가 발생하지 않는 예시

 

다음 예시는 carry가 발생한 예시입니다.

1이 올라가게 되면 가장 오른쪽 비트에 1을 더해줘야 맞는 값이 나오게 됩니다.

 

end-around carry를 적용하면 overflow가 발생하지 않고 정답이 됩니다.

이처럼 비트를 넘어가게 되면 따로 1을 더해줘야하는 연산 과정을 거쳐야 합니다.

 

 

문제는 다음 예시입니다. 보수 연산에서는 결과 값이 일정 값을 넘어가게 되면 연산을 고려하더라도 잘못된 값이 나옵니다. 이건 물론 2의 보수에서도 마찬가지로 발생하게 됩니다.

 

end-around carry를 고려하더라도 overflow가 발생하면서 답이 잘못되게 되죠.

 

3. 2의 보수(2's complement)

 

1의 보수에서는 +0과 -0을 구분지었는데요, 이것을 간단하게 해결하기 위해 1의 보수 방식에서 +1을 해주면 됩니다. 이것이 2의 보수 방법입니다. 1의 보수와 관련성을 만들면 비트를 반전시키고 1을 더하면 됩니다.

 

1's complement + 1 = 2's complement

 

예시로 보겠습니다.

 

carry가 생겼지만, 1을 단순히 무시해준다면 저희가 원하는 정답이 나오게 됩니다. 이전의 1의 보수 방식처럼 1을 따로 더해주지 않아도 됩니다.

 

 

2의 보수는 1의 보수의 문제점을 해결했습니다. 

다만, 2의 보수 연산도 마찬가지로 위의 예제는 문제가 없지만 연산 값이 -8을 넘어가게 되는 순간부터 값이 결과 값이 잘못되는 문제가 발생합니다.

 

 

지난 강에서는 10진법을 2진법을 포함한 다른 수체계로 바꾸는 방법을 알아봤습니다. 이번 강에서는 2진법 계산 방법 다뤄보려고 합니다. 뺄셈만 조금 주의를 하면 되고, 나머지는 10진법과 크게 다르지 않습니다.

 

1. 2진법 덧셈

 

2진법 덧셈은 다음 자리로 1을 올려주면 됩니다. 10진법과 크게 다르지 않습니다.

 

13과 11을 더하는 과정을 예시로 보겠습니다.

더했을 때 2가 되면 1을 다음 자리로 옮겨줍니다.

 

2. 2진법 뺄셈

 

 

뺄셈은 0 - 1 이 나왔을 때만 신경쓰면 됩니다. 0 - 1 은 그 자체로 계산이 되지 않기 때문에, 다음 자리에서 값을 빌려오면 됩니다. 

빌려준 것이니까 다시 빼줘야 겠죠? 아래 그림을 통해서 계산 방법을 익히면 이해가 더 쉽습니다.

 

파란 박스에 쓴 1은 덧셈에서의 1과 다른 개념으로 빼줘야 합니다.

 

빌려준 자리에 1을 써줍니다.

 

이진법 뺄셈 다른 예제는 다음과 같습니다.

 

 

 

3. 2진법 곱셈

 

곱셈은 각 자리별로 계산한 값을 자리에 맞게 곱해준 후, 그 값들을 이진법 덧셈을 해주면 됩니다.

 

 

4. 2진법 나눗셈

 

10진법 나눗셈과 동일한 방식으로 하면 됩니다.

몫은 이진법으로 1101 이고 나머지는 10 이네요. 

1. 디지털 시스템과 아날로그 시스템


디지털 시스템과 아날로그 시스템은 각각 다음과 같은 차이가 있습니다. 논리회로는 디지털 시스템에 해당하는 부분을 배우게 됩니다. 그 특징들을 알아봅시다.

Digital and Analog system

 

analog system = continuously

digital system = discrete -> 이 과목에서 배우게 될 부분

 

논리회로는 전기전자공학이랑 컴퓨터공학에서 전공 과목으로 배우는 과목입니다. 사실은 (디지털)논리회로로 논리 연산의 방법과 디지털 회로에 쓰이는 개념과 적용 방법을 배우는 과목입니다. 기본적으로 입출력이 0과 1로 구성되어 있기 때문에 아날로그 방식과는 다른 부분입니다.

 

 

2. 10진법과 2진법

 

일상에선 10진법에 익숙하지만, 논리설계를 시작으로 하드웨어에서는 2진법을 사용하기 때문에, 2진법 표기 방법을 알아야 합니다. 전자기기의 경우는 신호를 특정 순서로 그룹화 해서 인지하기에 해당 신호가 켜졌는지(1), 꺼졌는지(0)를 구별하기 때문에 더 용이합니다.

 

10진법 2진법 표현

 

 

꼭 10진법과 2진법이 아니더라도 N진법이라면 자리 수에 맞게 N의 멱급수 (Power Series)로 표현하면 됩니다.

 

 

3. 16진법

 

10진법 이후부터는 숫자로 표현하기 어려워지는 문제가 생기는데요, 10부터는 알파벳으로 표현하게 됩니다. 

10은 A, 11은 B 이런식으로 모든 숫자를 표현할 수 있게 됩니다. 

 

 

 

4. 10진수 정수 부분을 2진수로 변환하기

 

나누고 남은 나머지를 나열하면 된다.

 

3진법, 16진법 등 몇 진법인지 상관없이 같은 방식으로 나눠주고 나머지를 써준 후 나열하면 됩니다.

 

5. 10진수 소수 부분을 2진법으로 변환하기

 

정수 부분과 다르게 곱해서 구해준니다. 소수 부분은 따로 계산을 해주면 되는데, 곱 계산을 한 후 정수 부분을 나열해주면 됩니다.

 

같은 부분이 반복되는지 확인하고 반복을 표시해줍시다

 

6. 예제 - 4진수를 7진수로 변환하기

 

+ Recent posts