이산적인 컴퓨터 내부

컴퓨터는 내부적으로 0과 1로 이루어진 디지털이면서 2진수로 동작을 한다고 합니다.

실제로 논리회로 수준으로 내려가 보면 0과 1을 간단하게 아래처럼 정의를 해볼 수 있겠지요.

 

전류가 통하면 1, 안통하면 0

전압이 높으면 1, 낮으면 0

이런식으로 1아니면 0으로 나타낼 수 있습니다. 이렇게 중간이 없고 "1아니면 0이다" 라고 딱딱 나뉘어져 있는것을 이산적(Discrete)라고 합니다.

 

그래서 이산수학(Discrete Mathematics)이 컴퓨터공학과 밀접하게 관련이 있는 것입니다.

이산적이지 않다면 연속적이라고 하겠지요. 0도 있고 1도 있고 0.5도 있고 0.75도 있고 이런식으로 실수 범위까지 확장이 된다면 연속적이라고 부를 수 있을 것 같습니다.

 

하지만 값들이 0, 1, 2, 3, 4 처럼 딱딱 나뉘어져 양자화 되어 있다면 이는 이산적인 특징을 가졌다고 볼 수 있겠지요.

 

컴퓨터에서의 자연수 표기

어쨋든 컴퓨터는 기본적으로 Compute를 하기 위한 기기이고, 계산을 하기 위한 계산기에서 시작을 했습니다. 사칙연산이 가장 기본이 되는 연산이지요. 그래서 컴퓨터에서는 일단 수를 표현해야 하는데, 실수범위를 표현하기에 앞서서 정수를 먼저 표현해봅시다.

 

사실 정수보다도 자연수를 표현하는 것이 더 쉽겠지요.

0과 1로만 이루어져 있으면, 요즘 공교육 교육과정에서는 초등학교때 배우는지, 중학교때 배우는지는 모르겠지만 어쨋든 2진법이란게 생각이 날 수 있습니다.

 

흔히 사람들이 사용하는 10진법은 0부터 9까지의 총 10가지 아라비아 숫자로 크기를 표현하는데, 2진법은 0과 1이라는 2가지의 아라비아 숫자로 크기 값을 표현합니다.

 

간단하게 2진법으로 표현을 하면 컴퓨터에서 쉽게 자연수를 표기할 수 있겠지요. 그리고 0까지도 표현할 수 있습니다.

컴퓨터의 워드사이즈

이제 자연수를 컴퓨터에서 표현하기 위해, 컴퓨터의 워드사이즈와 비트(bit)라는 정보 단위를 설명하도록 하겠습니다.

일단 bit는 binary digit의 약자로, 이진수 숫자 한 자리라는 뜻이라고 보시면 됩니다.

이 bit는 정보의 단위로, 이진수 숫자 한 자리만큼의 정보량이라고 보면 됩니다.

이는 즉슨 1bit의 정보는 0아니면 1을 표현할 수 있습니다.

2bit의 정보는 00, 01, 10, 11의 4가지 종류의 정보를 표현할 수 있습니다.

 

컴퓨터에는 워드사이즈 라는게 있는데, 워드 사이즈는 워드(word)의 크기(size)입니다. 워드는 컴퓨터가 처리하는 최소 데이터 크기라고 보면 됩니다.

옛날 컴퓨터들 보면 8bit 컴퓨터, 16bit 컴퓨터 이런식으로 이름을 가지고 있는 녀석들이 있는데, 앞에 8bit, 16bit는 그 컴퓨터의 워드 사이즈를 뜻하는 것입니다.

8bit로 자연수 표현하기

 

이번에는 이해하기 쉽고, 그림그리기도 쉽게 8bit 워드사이즈를 갖는 컴퓨터를 기준으로 설명해보겠습니다.

8bit면 총 8자리로 된 2진수 값을 표현할 수 있을 것입니다.

위 표는 모든 비트가 0일때, 당연히 2진수로 값이 0이고 어떻게 평가되는지를 나타내는 모식표입니다.

오른쪽 부터 인덱스를 0부터 센다고 치고, 0번째 인덱스에 있는 비트는 2의 0제곱의 값을 나타내고, 1번째 인덱스는 2의 1제곱, 이렇게 n번 인덱스의 값은 2의 n제곱의 값을 나타냅니다.

 

이때 0번째 인덱스 비트는 가장 작은 값을 나타내고 따라서 가장 덜 중요한 비트(LSB: Least Significant Bit)라고 부르며, 7번째 인덱스 비트는 가장 큰 값을 나타내고 따라서 가장 중요한 비트(MSB: Most Significant Bit)라고 부릅니다.

만약 워드사이즈가 16bit라면, 15번 인덱스 비트가 MSB가 되겠지요.

 

어쨋든 저렇게 1을 나타낼 수 있습니다.

비슷하게 5를 나타낸다면 아래와 같이 되겠지요.

8bit 자연수 중 가장 큰 값은 255가 될 것이며 2진수로는 1이 8개 있는 형태가 나옵니다.

이걸로 왜 스타크래프트 유즈맵에서 공격력 방어력 업그레이드가 255까지 밖에 안되고, 유닛 1마리의 킬 수를 총 255까지 밖에 못 세는지에 대한 실마리를 대충 얻을 수 있을 것입니다. 해당 정보를 8bit, 즉 1byte 자료구조로 저장하고 있기 때문이지요.

8bit로 음의 정수 표현하기

그런데 말입니다. 그러면 음수는 어떻게 표현할까요? 자연수의 경우 그냥 우리가 알고 있는 2진수를 때려박으면 쉽게 됩니다. 이제 음수를 표현해보도록 하겠습니다.

일단 음수와 양수를 둘 다 표현하는데는 크게 3가지 방법이 있습니다.

1. Sign & Magnitude (부호와 크기)

2. 1의 보수

3. 2의 보수

 

Sign & Magnitude

일단 이 방식은, bit하나를 부호 비트로 두고, 나머지로 크기를 나타내는 방식입니다.

대충 요런 식인데, 0번 비트부터 6번 비트는 우리가 아는 그 2진수 그대로 가게 되고, 7번 비트는 1이면 음수라서 -1을 곱해주고, 7번비트가 0이면 양수라서 아무일도 하지 않는(+1을 곱하는) 식입니다.

 

일단 이 방식으로 가장 큰 양수를 표현해보도록 하겠습니다.

7번을 뺀 나머지 비트가 다 1이면 127라는 가장 큰 양수를 표현할 수 있습니다.

가장 작은 음수는 모든 비트가 1인 -127을 표현할 수가 있습니다.

-127를 표현한 모습입니다.

 

그런데 이 방식은 조금 문제가 있습니다.

지금 보이는 값은 -0에 해당합니다. 

그렇습니다. 이 방식은 +0과 -0이 둘 다 존재하게 됩니다.

 

그리고 음수에 대한 덧셈이나 뺄셈 계산 시 기존 덧셈과는 다른 방식의 로직 구현이 필요하게 됩니다.

1의 보수

그래서 이러한 점을 보완하기 위한 1의 보수라는 개념(1's Complement)이 있습니다.

1의 보수를 취하게 되면 0인 값들은 1이 되고 1인 값들은 0이 됩니다.

1의 보수 관계에 있는 수는 기존 수에 부호를 전환한 것과 동일하게 됩니다.

즉 00000001 이 +1이면 11111110는 -1이 되는 방식입니다.

 

하지만 이 역시 -0이 존재하는 문제가 있습니다.

위는 -0 아래는 +0입니다. 서로 모든 bit를 negation한 값에 해당합니다.

 

다만 Sign & Magnitude와는 조금 나은 부분이 있는데, 덧셈 연산의 경우 입니다.

-1과 +1을 더한 경우를 한번 보겠습니다.

이 경우가 -1에 해당하고 11111110의 bit 값을 갖습니다.

1의 값을 가지며 00000001의 bit값을 갖습니다.

같이 더하면 11111111이 되고 -0이 됩니다. 

 

0이 2개라서 음수에서 양수가 되는 경우 1의 오차가 있는 것 빼고는 덧셈도 어느정도는 되는 모습입니다.

그리고 표현할 수 있는 값의 범위는 부호&크기 의 경우와 마찬가지로 -127 ~ +127입니다.

2의 보수

2의 보수(2's Complement)에 대해 한번 설명해보겠습니다. 현대 CPU들은 거의 모두 2의 보수를 쓰고 있고, 이전에 소개한 방법들에 비해 장점들만이 명확합니다.

표현법 자체는 간단한것이 정수 표현때와 비슷한데 MSB가 나타나는 값을 +128가 아닌 -128를 하도록 하면 됩니다.

그리고 2의 보수를 취한다는 것은 1의 보수를 취한 뒤 1을 더하면 됩니다.

이 표현법에서 서로 2의 보수 관계에 있는 수는 부호가 바뀐 관계를 갖습니다.

위와 같은 배열을 갖습니다. 가장 큰 양수와 가장 작은 음수를 표현해보겠습니다.

가장 큰 양수의 경우는 아까들과 동일한 +127입니다.

가장 작은 음수는 -128이 됩니다. 이전에는 -127이었는데 왜 -128까지 표현이 가능할까요?

2의 보수 표현법에서는 0이 2개가 아닌 1개이므로 하나의 -0이 차지하던 것이 의미있는 값을 하나 더 표현할 수 있게 된 것입니다.

 

그리고 덧셈을 한번 해보죠. -128과 +127를 더해봅시다.

정확한 값인 -1이 나옵니다.

 

여기서 8을 한번 더 더해봅시다.

11111111 + 00001000을 하면 마지막 올림수인 8번째 bit의 값은 버려지게 되므로 00000111이 됩니다.

정확한 값인 7를 표현할 수 있습니다.

 

이렇게 2의 보수는 다음과 같은 장점이 있습니다.

  • 0이 1개이다.
  • 가장 넓은 범위의 수를 표현 가능하다
  • 음수를 더하면 뺄셈처럼 정확히 동작한다

이러한 이유들로 1의보수나 Sign&Magnitude에 비해 명확한 장점들이 있어서 널리 쓰이는 방식입니다.

+ Recent posts