도영스 공간
chapter13 그렇다면 뺄셈은 어떨까요 ? 본문
내가 챕터 13 발표를 맡게 되어 정리한 내용이다.
앞장에서 이진 덧셈을 하고, 자신감이 붙어서 뺄셈은 어떨까?라는 의문을 제시하며 chapter 13이 시작됩니다.
덧셈과 뺄셈은 여러 측면에서 상호 보완적인 부분이 있으며 연산이 이루어지는 방법에서 약간 차이가 있다고 합니다.
덧셈은 숫자의 가장 오른쪽 가장 낮은 자리에서부터 왼쪽으로 순서대로 계산해나가는 방식(을 이용합니다.)
=> 이 방식을 이용하는 이유는 각 자리에서 발생한 자리올림 수를 다음 자리의 숫자들과 같이 더해야 하기 때문입니다.
뺄셈은 자리올림수가 발생하는 것이 아니라 빌림수가 발생하여 본질적으로 덧셈과 이런저런 면에서 서로 다른 연산 방식을 가지고 있습니다.
ex ) 전형적인 빌림수가 발생하는 뺄셈의 예를 알아보겠습니다.
이 문제를 풀기 위해 오른쪽 자리에서부터 연산을 시작합니다. 5-6에서 빌림수를 가져와 연산하면, 7 / 5는 3번째 5한테 1자리 빌려주었으니까 4-7의 연산 결과는 7 그렇게하여서 답은 77이 됩니다. 다들.. 하시죠 ? 🥺
저희는 초등학생 시절 다 깨우친 거지만, 논리 게이트들에게는 까다로운 연산이라고 합니다. 즉 논리게이트들이 바로 풀기엔 아직 부족하다고 합니다. 빌림 없이 뺄셈을 할 수 있는 간단한 트릭으로 뺄셈에 대해 알아보는 과정을 통해 컴퓨터에 음수가 어떤 방식으로 저장되는지 알 수 있다고 합니다. (우리는 굉장히 자세히 살펴보아야겠죠..?)
뺄셈에는 빼는수와 빼어지는 수가 사용됩니다.
예 ) 빌림없이 빼는 수를 빼는 방법의 예
9로 이루어진 숫자열에서 어떤 값을 뺀 결과를 9의 보수라고 부른다고 합니다.
즉 176에 대한 9의 보수는 823이 된다는 말입니다. 반대로 823에 대한 9의 보수는 176이 됩니다.
보수를 사용할 때 좋은 점은 빼는 수가 무엇이든 9의 보수를 사용하여 계산하면 빌림 과정이 필요하지 않다는 것입니다.
예 ) 빼는 수에 대한 9의 보수 구한 다음에 뺄셈하는 예...
빼는 수에 대한 9의 보수를 구한 다음에 빼어지는수에 더하고 마지막으로 1을 더하고 1000을 빼면 수를 빌리지 않고 뺄셈을 할 수 있다고 합니다. 1076 +1 -1000 = 77
원래 뺄셈의 문제는 253 - 176이었습니다. 이 수식은 253-176+999+1-1000 이렇게 바꿀 수 있습니다.
253 + (999 - 176) + 1 - 1000 이렇게 묶을 수도 있습니다.
이렇게 1번의 뺄셈을 2번의 뺄셈과 1번의 덧셈으로 바꾸었지만, 귀찮은 빌림 과정은 없앨 수 있었습니다.
위 과정들은 다 빼는수가 빼어지는 수보다 작은 경우들이었습니다.
여기에서..만약 빼는수가 빼어지는 수보다 크다면 .. 어떻게 되는지 설명해줍니다..
176 - 253 을 예로 들어봅시다. (연산하면 -77)
1. 999-253으로 빼는 수의 9의 보수를 구합니다. (746)
2. 9의 보수와 빼어지는 수를 더합니다. (176 +746 = 922 )
3. 1000을 빼야되는데 빌림이 발생하여 999를 빼는 방법을 사용합니다. (922 - 999 = -77)
음수가 된다는 것을 알 수 있지만, 두수를 바꾸어서 999-922 를 뺍니다.
음 이 뒤에 이진수로 바꾸어서 뺄셈하는 과정이 나오는데 ..너무 길어질 것 같아서 빼버렸습니다.
간단히 요약하자면,
십진수에서 9의 보수라고 불리는 것이 => 이진수에서는 1의 보수라고 불립니다. 1의 보수를 이진수의 반댓값 혹은 역수라고 이야기 한다고 합니다.
덧셈기에서 핵심적인 부분은 논리 게이트로 만들어진 8비트 가산기 부분이었습니다. 8비트 가산기의 제어판에 스위치 하나를 추가해서 덧셈을 할 것인지 뺄셈을 할 것인지 나타낼 수 있도록 새 제어판을 만들었습니다.
9번째 전구는 오버플로 언더플로 라는 레이블이 붙어있습니다. 이 전구는 연산의 결과가 여덟 개의 전구로는 정상적으로 표시 될 수 없는 경우라는 것을 알려줍니다. 즉 덧셈의 결과가 255보다 크거나 (오버플로) 뺄셈의 결과가 음수인 경우(언더플로)에 불이 들어옵니다.
덧셈과 뺄셈 모두 수행할 수 있는 연산기를 만드는 것이 목표이므로 뺄셈인 경우에만 입력 값이 반전되도록 만들 필요가 있다고 합니다.
위의 회로에서 인버트라는 신호는 8개의 XOR게이트에 모두 입력됩니다.
따라서 인버트 신호가 0인 경우에 XOR게이트의 출력은 입력과 동일한 값이 됩니다.
1의 보수를 계산하는 상자, 8비트 덧셈기 상자, 익스클루시브 OR게이트들을 위와 같이 연결 할 수 있다고 합니다.
서브라는 이름이 붙어있는 3개의 신호를 확인해보면 덧셈과 뺄셈을 선택하는 스위치가 있는 것을 볼 수 있습니다.
신호가 0인경우 덧셈을 수행하고 신호가 1인경우 뺄셈을 수행하는 것이지요..
머리가 복잡하지만... 위의 상자들에 대해 다시 더 자세히 설명드리겠습니다.
뺄셈이 수행되는 경우 B입력은 1의 보수를 만드는 회로를 통하여 덧셈기에 들어가기 전에 모든 비트를 반전시킵니다,.
덧셈기의 CI입력에 1을 입력시켜 덧셈을 처리하는 동안에도 1의 보수를 처리하는 회로에서는 아무런 일을 처리 하지 않으며, CI입력도 0이 됩니다.
서브 신호와 덧셈기의 CO출력은 XOR게이트의 입력으로 연결되어 있으며, 이 출력은 오버플로 언더플로 전구에 불이 들어오게 하는 데 사용 됩니다.
서브신호가 0인 경우 덧셈기의 CO출력이 1인 경우 전구에 불이 들어오게 됩니다. (즉 덧셈의 결과가 255보다 크다는 말)
빼는 수가 빼어지는 수보다 작은 경우에는 덧셈기의 CO출력으로 1이 출력됩니다.
따라서 오버플로/언더플로를 나타내는 전구는 덧셈기의 CO출력이 0인 경우 불이 들어와야 하지만, 빼는 수가 빼어지는 수보다 커져서 결과가 음수밖에 되지 않는 상황인데.. 이런 상황에 대해서 생각하지 않는다고 했으니 뺄셈을 수행하는 동안에 이 전구에 불이 들어올 일은 없다고 합니다.
이제 음수 표현 방법의 예를 말씀드리겠습니다.
실제 생활에서 음수를 볼 수 있는 경우 마이너스 통장입니다.
마이너스 통장 계좌에 잔고가 500달러 이상 될 수 없고 마이너스 잔고는 500달러까지 가능하다고 가정을 해봅니다.
즉 계좌 금액의 범위가 499달러에서 -500달러라는 이야기 입니다.이 범위를 통해 세자리 십진수가 모두 이용될 것입니다.
이는 모든 숫자에 대해 음수 표현이 필요한 것이 아님을 알 수 있습니다.
499까지만 양수로 사용하니까 500부터 999까지의 숫자는 양수로 표현되는데 필요하지 않게 되었습니다.
500부터 999까지는 음수를 표현하는 데 사용할 수 있게 되었다는 말입니다.
-500 -499 -498 ...-4 -3 -2 -1 - 1 2 3 4 ...498 499
이것을 아래와 같이 적을 수도 있습니다.
500 501 502 ...996 997 998 999 000 001 002 003 ...497 498 499
이렇게 원형으로 늘어진 형태를 가지고 있습니다. 이러한 형태의 표현 방식을 10의 보수라고 합니다. 10의 보수를 다른말로 하면 9의 보수 더하기 1이라고 한다고 합니다.
10의 보수를 사용한다면 뺄셈을 할 이유가 없다고 합니다.
만일 143달러에서 78달러를 인출했다고 가정한다면, 양수 143달러 더하기 음수 78달러라는 의미입니다.
이진수에서 위와 동일한 시스템이 바로 2의 보수를 사용하는 것입니다.
8비트의 숫자를 가지고 연산을 한다면, 가능한 수의 범위는 00000000에서 11111111까지이며 이는 십진수에서 0에서 255의 범위가 됩니다.
이렇게 숫자의 범위는 -128에서 +127까지 바뀌었습니다. 부호 있는 숫자를 나타낼 때 가장 왼쪽에 있는 비트는 부호 비트라고 이야기합니다. 1이되면 음수를 나타내고 0인 경우에는 양수를 나타냅니다.
이진수는 부호가 있는 숫자를 표현 할수도 있고, 부호가 없는 숫자를 표현 할 수도 있습니다.
하지만, 비트는 0과 1만을 나타내며 그 자체로 어떤 것을 나타내는지 알려주지 않기 때문에 이진수 자체로는 해당 숫자가 부호 있는 숫자인지 부호가 없는 숫자인지 판단할 수 있는 방법이 없습니다.
이러한 부분이 비트 사용의 어려움이라는 말을 끝으로 13챕터가 끝이납니다.
'CS > CS 스터디' 카테고리의 다른 글
chapter 20 아스키 코드와 문자의 변환 (0) | 2022.04.12 |
---|---|
CODE 책 스터디 3일차 정리 (0) | 2022.03.17 |