컴퓨터에서의 수 표현법(feat. 2의 보수란?)

김상윤·2022년 7월 5일
1

컴퓨터구조 기초

목록 보기
2/3

Intro

사람은 다른 사람과 대화하기 위하여 언어를 사용하고 그 언어를 이해함으로써 의사소통을 할 수 있다. 그렇다면 컴퓨터는 우리가 프로그래밍 언어로 작성한 데이터를 내부에서 어떻게 이해하고 있을까?

이번 포스팅에서는 컴퓨터에서 수를 어떻게 표현하는지 간략하게 짚고, 그것의 핵심인 2의 보수까지 설명해보고자 한다.

(필자가 궁금한 부분 위주로 정리 및 작성을 해보았고, 본인이 이해한 내용을 그대로 포스팅에 담아보았다...🤪)

컴퓨터에서 수를 표현하는 방법

우리가 사용하는 모든 데이터는 컴퓨터 내부에서 0과 1로 표현된다.

먼저 컴퓨터가 어떠한 목적으로 개발되었는지를 알아볼 필요가 있다.

최초의 컴퓨터는 수학식을 계산하는 도구로 개발되었다. 현재 우리가 컴퓨터로 게임하거나 영상을 보는 등의 기능들은 이러한 계산기의 기능의 발전이라고 볼 수 있다.
따라서, 현재의 컴퓨터 또한 여전히 숫자들을 바탕으로 하여 정보를 처리하고 계산하는 장치이다.

최초의 컴퓨터인 에니악은 수많은 진공관으로 이루어져 엄청난 크기였다는 것은 익히 알고 있을것이다. 에니악은 이러한 수많은 진공관들에 대한 상태정보를 신호로써 받아들이고 이것을 처리하여 결과를 보내주었다.

진공관의 기능은 전자가 흘려주거나 차단 할 수 있는 기능을 수행할 수 있다. 즉 전자 흐름을 제어하는 장치이다.

전자를 흘려주는 상태가 진공관을 켠 상태이고 이것을 1로 표현하였다. 반대로 전자를 차단하는 상태는 진공관을 끈 상태이고 이것을 0으로 표현하였다.

에니악은 이러한 두가지의 신호에 대해서 처리해 주었고, 이것이 오늘날 컴퓨터가 2진수를 사용하는 근본적인 이유가 되었다.

그 후, 트랜지스터가 등장하게 되면서 오늘날의 컴퓨터(CPU)의 등장을 앞당기게 되었다.

트랜지스터 또한 여전히, 전기 신호로 작동하는 스위치이고, 전기신호가 들어오면 켜지고 들어오지 않으면 꺼진다.

전기 신호가 들어오면 ON 또는 TRUE 상태이고, 컴퓨터는 이것을 1로 인식한다.
전기 신호가 없으면 OFF 또는 FALSE 상태이고, 컴퓨터는 이것을 0으로 인식한다.

현대사회를 지탱하는 컴퓨터의 내부에는 이러한 트랜지스터로 구성되어있어, 컴퓨터는 트랜지스터를 통해 전기 신호를 0과 1로 구분하여 처리한다.

즉 이러한 배경으로 인하여 컴퓨터는 2진법을 기반으로 작동한다.

bit, byte

따라서, 우리는 0과 1을 표현할 수 있는 단위체계를 마련해야했는데, 이러한 단위체계로 bit, byte가 등장하게 되었다.

0과 1을 표현할 수 있는 최소단위를 bit라고 한다.
8bit가 모이면 1byte가 된다.

그 이상의 단위는 아래 표로 정리해두었으니 참고해보자.

10진수와 2진수

우리가 일상 생활에서 사용하는 숫자는 0부터 9까지의 한 자릿수이다.
이것을 10진수라고 지칭한다.

그러나,

  • 컴퓨터 내부에서 모든 데이터를 0과 1로 표현하기 때문에, 우리가 일상생활에서 사용하는 10진수를 그대로 이해시킬수 없다. 따라서, 컴퓨터 내부에서는 2진수를 사용하여 데이터를 0과 1로 표현한다.
  • 컴퓨터 내부에서는 숫자뿐만 아니라 문자도 2진수로 표현한다. 따라서, 이것을 국제표준으로 정의하였는데, 이것이 바로 아스키코드이다.

아래는 아스키코드 테이블이다.

8진수와 16진수

그러나 2진수는 비트 값을 그대로 표현할 수 있으나, 너무 길어 가독성이 떨어진다. 따라서 이것을 8진수, 16진수로 바꿔서 사용한다. (8진수, 16진수로 바꾸는 법은 따로 설명하지는 않겠다.)

8진수는 2진수 3비트를, 16진수는 4비트를 합쳐서 간단하게 표현할 수 있다. 이로 인하여, 우리들이 볼때 더욱 간결하게 가독성을 높여서 확인할 수 있게 된다.

이때, 2진수로 표현할때는 앞에 0b를 붙이고, 8진수는 앞에 0, 16진수는 앞에 0x를 붙여서 표현법을 명시해준다.

부호있는 수를 표현하는 방법

그렇다면, 대충 우리가 실생활에서 쓰는 자연수나 문자들은 컴퓨터에서 2진수로 변환하여 처리한다는 것은 이해하였다.

그러나, 우리는 이러한 자연수 외에도 부호있는 수들 또한 많이 사용한다.

컴퓨터에서 숫자를 표현할 때 양수와 음수를 어떻게 표현할까?

컴퓨터는 0과 1만 표현할 수 있기 때문에 부호또한 0과 1로 표현한다.

즉, 부호를 나타내는 비트를 지정하여, 이 비트가 0이냐 1이냐에 따라서, 부호를 지정해준다는 것이다.

부호를 나타내는 비트는 2진수로 이루어진 여러 비트 중 가장 맨 앞의 비트이며, 이것을 부호비트(Most Significant Bit : MSB)라고 지칭하였다.

위의 말이 사실이라면 만약, 8비트 머신에서 -5를 표현한다면 다음과 같이 표현하게 되는 것이다.

이 값이 정말 -5인지 확인해 보기 위해서 2진수로 표현한 5(00000101(2))와 더해보자.

만약 진짜 위의 수가 -5라면, 5와 더했을 시, 0이 될것이다.

그러나 계산결과는 0이 나오지 않는다.

정리하자면,

맨 앞의 비트가 부호비트는 맞으나, 맨 앞 비트만 1로 바꾼다고 해서 음수가 되는 것은 아니다.

그렇다면, 결국 컴퓨터에서는 음수를 어떻게 표현하는가?
이때 등장하는 것이 2의 보수 이다.

2의 보수

보수의 수학적의미

보수의 수학적의미 부터 살펴보자.

가장 신뢰성이 높다(?)라고 볼 수 있는 위키피디아를 근거로해서 보면,

보수는 말 그대로 보충해주는 수를 의미한다.
→ 어떤 특정한 10진수 N이 있을 때 3에 대한 N의 보수를 구하라고 한다면, 3과 어떤 특정한 수를 합하여 N이 되는 수를 의미한다. 즉, 3에 대한 N의 보수는 N-3이 될 것이다.

좀 더 자세히 들여다보면,

K진법의 수 N이 있을 때 N을 K의 최소 제곱수가 되도록 만드는 수를 R의 보수라고 한다.

10진법의 수 12가 있을 때 12를 10의 최소 제곱수( 이 경우 100 )로 만드는 수는 88이므로 ( 12+88=100 ) 10진법 12의 10의 보수는 88이다.

정리하자면, K진법의 어떤 수 N이 있을때, N의 자릿 수를 하나 더 증가시키기 위해서 필요한 최소의 값을 보수라고 이해하면 좋을 듯하다.

👌그렇다. 위의 내용을 보면, 보수가 무엇인지 한번에 이해할 수 있을 것이다.👌
그런데, 이 보수를 통해서 음수를 표현할때, 왜 2의 보수를 사용하게 되는것인가?

2진수에서의 2의 보수란?

앞서 알아보았던, 보수의 수학적의미는 참고용으로만 기억해두자,
컴퓨터공학에서의 보수는, 앞서 보았던 보수의 수학적의미와 방향성은 같을지라도 차이가 있다고 생각한다.

2진수 N가 있다고 할때, 2진수에서의 2의 보수는 말 그대로 N를 보충하는 수 이다.

보충한다는 것은 위에서 보았던 수학적의미와 유사하다.

예시를 들어보자.
다음과 같은 2진수가 있다고 해보자. : 110(2)
이것과 010(2)을 더하게 되면 아래와 같을 것이다.
1101(2) + 0011(2) = 10000(2)

기존 값보다 한자리 높은 수(중에 가장 작은 수)가 결과로 나왔다.
따라서, 0011(2)는 1101(2)의 2의 보수라고 볼 수 있다. (보수의 수학적의미에 근거하여..)

위와 같이, 어떤 수와 2의 보수를 더하게 되면 하나의 특징이 보이는데,
가장 왼쪽에 한 비트가 1인 상태로 붙고, 나머지는 0이 되는 형태의 2진수가 된다는 것이다.

여기서 컴퓨터적인 성질이 적용된다.
우리가 수식으로 풀었을 때에는, 10000(2)이 나오지만,
이것을 자세히 보면 4비트와 4비트를 더했더니, 5비트가 나온 것으로 볼 수도 있다. 1비트가 초과되었다.

이러한 초과비트는 머신에서 truncate하여 떼어내게 된다.
그렇다면??

10000(2)이 1 + 0000으로 쪼개지고 1이 버려지게 되어, 0000(2)만 남게 된다.

최종적으로 결과값은 0이 된다.

정리하자면, 양수 X + X의 2의보수값 = 0 이 되므로
결과적으로 X에 2의 보수를 취하게 되면 그 결과는 음수가 되는것을 알 수 있다.

2의 보수를 구하는 법

2의 보수를 구하는 법은 그렇게 어렵지 않다.
몇가지 단계만 확실하게 기억해두면, 쉽게 어느 수에 대해서도 2의 보수를 구할 수 있다.

1. 1의 보수 구하기

어떤수의 2의 보수를 구하기 위해서는 먼저 1의 보수를 구해야 한다. 1의 보수는 단순하게 어떠한 2진수가 있을때, 이것을 반전시키면 바로 구할 수 있다. (0은 1로, 1은 0으로)

2. 가장 낮은 자리에 1 더하기

1의 보수를 구하였다면, 8bit머신 기준 본래값 + 1의 보수 = 11111111(2) 이 될것이다.
이제 여기에 가장 낮은 자리에 1만 더해주면, 100000000(2)이 될것이다.
이때, 8bit 머신이므로, 9bit는 처리해 주지 못하여, 가장 왼쪽의 bit는 떼어내서 결과를 낸다. 그 결과 00000000(2)이 결과가 된다.

3. 2의 보수가 맞는지 확인

정리하자면, 2의 보수는 본래값을 1의 보수로 바꾸고, 가장 낮은 자리에 1만 더하면 바로 구할 수 있다.
이렇게 구한 2의 보수를 본래값과 더하여, 제대로 0이 나오는지를 확인하면, 2의 보수 구하기가 마무리 된다.

Conclusion

처음 Computer Science에 입문하신 분들이라면, 2의 보수는 쉽지 않은 벽이 될 수 있다. 그러나, 또 한번 머리속에 넣어두면 그만큼 잊기 어려운 내용이므로, 한번에 제대로 이해하고 항상 기억하면서 개발하면, 두고두고 써먹을 곳이 많다. (사실 더 이야기할 것은 많으나,, 컴퓨터 구조론으로 넘어가서 양이 너무 방대해질것 같다..는건 함정.. 집중력을 위해서 이 정도만 기술하겠다.)

profile
알고리즘을 아직도 모르겠다

0개의 댓글