주인장의 프로그래밍 개발 공부방

[Chapter 7 컴퓨터 구조] 1. 2진법의 음수 표현 (1편 - 부호 절댓값) 본문

프로그래밍 기본 지식/Chapter 7 컴퓨터 구조

[Chapter 7 컴퓨터 구조] 1. 2진법의 음수 표현 (1편 - 부호 절댓값)

거신 2022. 9. 13. 17:32

최근에 달렸던 댓글에 답변을 하면서 문득 뇌리를 스친 내용이 생겨서

정말 오랜만에 간단한 컴퓨터 구조론 지식을 포스팅해보고자 한다.

이 내용을 공부한 지 오래되어서 예전에 공부했던 정보처리기사에서 정보를 얻고자 검색했는데

2020년 이후로 개정된 정보처리기사는 나에게 있어 너무 생소한 기사 자격증이 되어 버려서

잠시 정신을 잃을 뻔하다가 다시 정신을 차리고 여기저기서 공부를 하고 내 나름대로 작성해보려 한다.

 

잡설은 그만두고 여기에서 작성되는 내용은 직접적으로 프로그래밍을 언급하는 부분이 아니라

컴퓨터 공학과 관련된 지식을 얻고 간다는 생각으로 가볍게 읽어줬으면 좋겠다.

읽어보고 이해가 잘돼서 나의 지식이 되면 좋은 것이고 모르면 어쩔 수 없는 것이고....

 

설명에 있어서 최대한 풀어서 설명하는 경향이 있기에 글이 길어질 수 있으므로

여려 편으로 나눠서 설명을 진행할 계획이다.

이번 편에서는 부호 절댓값에 대해서 설명할 것이다.

 

목표 : 2진수의 음수 표현 방법 중 부호 절댓값에 대해서 변환하는 방법과 단점을 이해한다.

 

0. 서론

 

우리가 흔히 사용하고 있는 컴퓨터는 0과 1을 가지고 모든 데이터를 표현한다. 양자 컴퓨터 이런 건 얘기가 달라지겠지만

일단 우리가 알고 있는 컴퓨터의 구조에서는 0과 1만이 존재하고 이 2개의 숫자로 연산을 진행하는 것을

우리는 2진법이라고 말하는 것이다.

 

그런데 궁금한 점이 생기지 않는가?

단순히 0과 1을 이용해서 연산을 하는데 음수는 어떻게 표현할 수 있는 것일까?

비트에 부호가 있는 것도 아니고 -(마이너스)는 어떻게 표현한다는 것인가?

그리고! 도대체 컴퓨터는 어떻게 뺄셈이란 걸 할 수 있는 것인가??

알고보면 컴퓨터는 사칙연산 중에서 덧셈 밖에 할 줄 모르는 녀석이다.

컴퓨터는 논리회로로 이루어져 전기적 신호를 가지고 논리 연산을 실행하는 계산기이다.

우리가 보통 컴퓨터는 0과 1로 이루어져 있다고 하지만

우리가 숫자로 0과 1로 표현한 것이지 실질적으로 전기 신호의 ON / OFF를 말하고 있는 것이다.

이러한 전기 신호를 다양한 논리 게이트 (AND, OR, NOT, XOR, NOR 등등)를 이용해

산술 연산을 하는 기계가 바로 우리가 지금 사용하고 있는 컴퓨터인 것이다.

(혹시라도 나중에 기회가 된다면 논리 게이트에 대해서도 간단하게 알아볼 수 있도록 하겠다.)

 

이런 논리 게이트 조합되어 가산기가 되어 컴퓨터의 산술 논리 장치(ALU)의 부분으로 동작하는데

문제는 가산기라는 건 덧셈만 하는 기계라는 뜻이기도 하다.

 

그렇다면 컴퓨터에서는 어떻게 뺄셈을 연산할 수 있으며 또, 음수는 어떻게 표현할 수 있다는 것일까?

컴퓨터 구조와 관련해서 조금 더 심화된 내용을 여기에서 다루기엔

너무 복잡하고 또 이 글을 읽는 목적에도 어울리지 않기 때문에 생략하고

우리는 일단 컴퓨터에서 음수를 표현하는 방법부터 알아가보고자 한다.

 

컴퓨터는 덧셈만 하는 장치라고 했으니

이는 음수로 표현할 수 있는 방법만 알 수 있다면 덧셈만으로도 뺄셈을 구현할 수 있다고 유추할 수 있을 것이다.

그러므로 우리는 컴퓨터에서 음수를 표현하는 방법에 대해서

집중적으로 알아보도록 하자.

 

컴퓨터에서 음수를 표현하는 방법으로 3가지가 있다.

부호 절댓값, 1의 보수, 2의 보수

이렇게 총 3가지의 표현법이 있는데

현재 우리가 사용하고 있는 대부분의 컴퓨터에서는 모두 2의 보수라는 방식으로 음수를 표현하고 있다.

2의 보수가 등장하기 전에 음수를 표현하는 방법으로 고안되었던 방식인

부호 절댓값1의 보수는 방법은 간단하지만 단점이 분명했기 때문에

이제는 사용하지 않는 방식이다.

하지만 필요한 지식이 될 수도 있으니 하나하나 차근차근 살펴보도록 하자.

 

1. 부호 절댓값

 

컴퓨터에서 가장 간단하게 음수를 표현할 수 있는 부호 절댓값이다.

지루하게 글로 읽지 말고 예시를 가지고 좀 더 직관적으로 알아보자.

 

참고로 우리가 사용하는 컴퓨터의 프로세서는 32bit, 64bit 등의 연산 단위를 가지고 있는데

여기에서 32bit, 64bit 등으로 표현하면 너무 복잡하니까

우리는 간단하게 8bit를 기준으로 알아가보자.

 

예를 들어 11 (2)을 2진법으로 표현하면

 

예시 1)

0 0 0 0 1 0 1 1

이렇게 적을 수 있는데

부호 절댓값을 이용해 -11 (10)을  표현하고 싶다면

 

예시 2)

1 0 0 0 1 0 1 1

그림과 같이 맨 왼쪽의 비트를 1로 바꾸기만 하면 된다.

물론 8bit 이상의 자리라도 동일하게 가장 왼쪽의 비트 값을 1로 바꾸면 된다.

여기서 가장 왼쪽 비트MSB(Most Significant Bit), 최상위 비트라고 말하고

여기에서는 부호를 구분하는 용도로 사용했기 때문에 부호 비트라고 표현한다.

 

이렇듯 부호 절댓값은 비트 하나만 바꾸면 되는 방법이기 때문에 음수를 표현할 수 있는 가장 간단한 표현법이다.

하지만 지금 우리가 사용하고 있는 컴퓨터에서 음수를 표현하는 방법으로 부호 절댓값을 사용하지 않는다.

그 이유는 생각보다 간단한 이유가 있다.

 

2. 부호 절댓값의 함정

 

부호 절댓값은 가장 왼쪽 비트, 다시 말해, 최상위 비트(MSB)의 값을 바꿔서 표현하는 방법이기 때문에

사람의 입장에서는 직관적으로 파악할 수 있다는 장점이 있지만

컴퓨터에게는 너무나도 불편한 녀석이 아닐 수 없다.

 

가장 간단한 예시로 위의 예시 1)예시 2)를 더해보자.

 

예시 3)

11   0 0 0 0 1 0 1 1
-11 + 1 0 0 0 1 0 1 1
-22? 1 0 0 1 0 1 1 0

결과에서도 볼 수 있듯이 11 (10)과 -11 (10)을 더했는데

결괏값으로 0이 아닌 -22 (10)이 나와버렸다.

 

다른 예시를 살펴보자.

 

예시 4)

-32   1 0 1 0 0 0 0 0
-17 + 1 0 0 1 0 0 0 1
49? 1 0 0 1 1 0 0 0 1

이번에는 음수 -32 (10)와 음수 -17 (10)를 더해 보았다.

부호 비트가 두 수 모두 1이라서 덧셈을 하니 자릿 수를 넘어가버리는 오버플로우가 발생해 버렸다.

비록 부호 비트는 없어져 버렸지만 어쨌든 절댓값만 따진다면 결괏값은 49 (10)로 제대로 계산은 됐다.

혹여 두 수 모두 부호 비트가 1인 음수라면 부호 비트는 연산하지 않고 그대로 1로 두는 동작을 구현한다면

아마 이 부분은 해결이 될테지만 하드웨어로 설계할 때 아마 엔지니어의 머리는 터져 나갈 것이다.

 

위의 예시들을 보더라도 단순히 논리 회로들로만 구성되어 있는 컴퓨터를 설계하는데 있어서

얼마나 복잡해질지 정신이 아득해 질 것이다.

수많은 케이스를 생각하고 또 각 케이스들마다 논리회로를 구현해야 한다면....

 

또한 부호 비트만으로 양수, 음수를 구분하는 덕분에 0에 부호가 붙는 요상한 숫자까지 등장하게 된다.

 

예시 5)

+0? 0 0 0 0 0 0 0 0
-0? 1 0 0 0 0 0 0 0

부호 비트를 제외한 나머지 비트로만 숫자를 표현하게 되니 0이 2개가 존재하게 되고

부호 비트에 따라 부호가 붙게 되니 +0, -0이라는 숫자가 등장하게 되는 것이다.

 

결국 이러한 단점을 가진 부호 절댓값은 우리와 함께 할 수 없게 되었고

이론으로 남겨지게 되었다.

 

2편 1의 보수, 2의 보수 에서 계속

 

※ 부족한 부분과 잘못된 부분이 많아서 전체적으로 내용을 많이 수정하고 추가하였습니다.

혹시라도 잘못된 정보를 얻고 가셨던 분들에게는 양해의 말씀을 전합니다.

Comments