C 언어 | 컴퓨터 시스템 개발 | 데이터 표현

컴퓨터의 세계에서는 전기적으로 켜거나 끄거나 하는 ON, OFF 두가지 상태를 되풀이 하는 2진법으로 모든 정보가 표현되어 있다. 여기에서는 2진법이나 음수 표현에 사용되는 보수에 대해 설명한다.

기본수

정보 과학의 기초는 2진수와 16진수 등의 데이터 표현과 논리 연산에 있다. 특히 2진수와 16진수를 이해하지 않으면 C 언어를 충분히 이해할 수 없기 때문에 여기에서는 10진수를 2진수나 16진수로 변환하는 방법 등 정보의 기초 이론을 학습한다 .

우리 인간이 사용하는 숫자는 10진수라고 한다. 10진수는 0 ~ 9까지의 숫자를 사용한 10개의 기호로 구성되어 있다. 이 10진수를 사용하여 숫자를 세는 것을 10진법이라고 하고, 자리수가 올라가는 숫자 10을 기본수라고 한다. 이는 많은 현대인이 초등학생 시절부터 당연하게 가르쳐 있기 때문에 10진법을 사용하는 것이 상식으로 되어 있지만 세계 인류가 반드시 10진수를 사용하는 것은 아니며 인류가 처음부터 10개의 기호로 숫자를 세고 있었던 것도 아니다.

뉴기니의 일부 원주민은 신체의 일부를 숫자에 대응시켜 계산하는 방법을 사용하고 있으며, 홋카이도의 아이누 민족이나 로마 숫자는 5진법과 10진법을 혼합시킨 숫자를 사용하고 있다. 이렇게 대부분 숫자 5와 10을 기준으로 구분되어 있다는 특징을 볼 수 있다. 바빌로니아와 이집트의 숫자도 10개가 모이면 기호가 변화하는 구조를 가지고 있었다. 이것은 아이가 손가락으로 숫자를 세는 것처럼, 옛날 원시인이 손가락으로 손가락 계산을 하고 있었기 때문이라고 생각한다. 우리가 사용하는 0, 1, 2, 3~8, 9라는 기호는 인도가 발상지이다. 여기서 처음으로 0이라는 개념이 생기고, 이것이 아라비아에 전해져, 그 후 유럽 각지에 전해진 것으로 간주한다.

그런데, 이것이 우리가 일상에서 사용하는 숫자의 태어난 과정이지만, 컴퓨터의 숫자 분석 방법은 인간의 그것과는 전혀 다르다. 적어도 컴퓨터는 10개의 손가락을 가지고 있지 않는다. 즉, 컴퓨터가 수를 계산할 경우, 10진법으로는 그다지 좋지않다.

그래서 컴퓨터는 수를 전압의 차이로 판단하는 방법을 이용하고 있다. 전압이 높으면 1, 그렇지 않으면 0이라고 하는 방식이다. 즉, 컴퓨터가 취급하는 기호는 0과 1이고, 이 두 기호를 이용한 숫자를 2진수라고 부르는 것이다. 2진수는 1자리당 1까지만 계산되지 않기 때문에 2n마다 자릿수가 오른다. 이것은 n자리 번째 2진수의 값이 2(n - 1)인 것을 의미한다.

표1 - 10진수와 2진수

10진수 2진수
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001

이와 같이 10진수는 0과 1만을 사용하는 2진수로 변환하여 표현할 수 있고, 디지털 데이터는 2진수로 표현되어 있다. 그러나 표1을 보면 알 수 있듯이, 2진수는 숫자가 많아지기 때문에 인간은 읽기가 어렵다. 그래서 인간이 디지털 데이터를 직접 다루는 경우는 16진수를 사용하는 것이 일반적이다. 2진수를 다른 진수로 변환하여 표현하는 경우, 4진수, 8진수, 16진수 중 하나를 사용한다. 4진수는 3이상이 되면 자릿수가 올라가고, 8진수는 7이상이 되면 자릿수가 오른다.

그러나 16진수의 경우는 숫자만으로는 표현할 수 없기 때문에, 9이상은 A에서 F까지의 알파벳으로 표현한다.

표2 - 다양한 기본수

10진수 2진수 4진수 8진수 16진수
0 0 0 0 0
1 1 1 1 1
2 10 2 2 2
3 11 3 3 3
4 100 10 4 4
5 101 11 5 5
6 110 12 6 6
7 111 13 7 7
8 1000 100 10 8
9 1001 101 11 9
10 1010 102 12 A
11 1011 103 13 B
12 1100 110 14 C
13 1101 111 15 D
14 1110 112 16 E
15 1111 113 17 F

표2는 2, 4, 8, 16을 기본수으로 수치의 관계를 나타낸다. 컴퓨터 내부의 디지털 데이터의 본질은 2진수이며, 프로그래밍 언어와 바이너리 편집기(디지털 데이터를 직접 편집 할 수 있는 소프트웨어) 등은 16진수로 표현한다.

음수 표현과 보수

2진수만으로 모든 것이 표현되는 세계에는 부호가 존재하지 않는다. 그래서 디지털에 음수를 표현하기 위해 사용되는 것이 보수이다. 보수(補數)는 보충을 해주는 수를 의미한다. 보수는 2종류로 나뉘는데, 더하면 하나 많은 숫자의 최소가 되는 값을 진정한 보수, 숫자의 범위에서 최대치가 되는 수를 모의 수라고 한다. 10진수로 생각하면 4에 대한 10의 보수는 6(4 + 6 = 10)이며, 9의 보수는 5(4 + 5 = 9)이다.

2진수에서 가능한 보수는 1의 보수(모의 수)와 2의 보수(진정한 보수)이다. 1의 보수의 경우, 더해서 1이 되는 수는 0이면 1, 1이면 0이므로 단순히 각 숫자를 반전 시키면 된다는 것이다. 2의 보수의 경우는 더해서 1자리에서 최소가 되는 수를 생각한다. 예를 들어 2진수 1010의 2의 보수는 0110이다. 2의 보수를 요구하는 간단한 방법은 1의 보수에 1을 가산하면 된다.

1100 1010의 1의 보수 = 0011 0101 (1100 1010 + 0011 0101 = 11111111)

0110 1101 2의 보수 = 1001 0011 (0110 1101 + 1001 0011 = 100000000)

2 진수는 2의 보수를 사용하여 음수를 표현할 수 있다. 첫째, 음수를 나타내기 위해 비트 열의 최상위 비트를 부호용으로 사용한다. 최상위 비트가 1이면 음수, 0이면 양수임을 보여준다. 양수의 경우 나머지 비트를 그대로 계산할 수 있지만 음수인 경우 나머지 비트 2의 보수가 절대 값이다.

1111 1100라는 8비트 열을 상정한 경우, 최상위 비트가 1이므로 음수라고 판단할 수 있다. 그리고 나머지 7비트 2의 보수를 구하면되기 때문에 000 0100 즉 -4임을 알 수 있다. 2의 보수를 이용한 음수 표현은 감산 처리를 가산 처리할 수 있음을 나타낸다. 2의 보수에 의한 음수 표현은 정보 이론의 기초이며 C 언어를 배우는 데에도 중요하다.




최종 수정 : 2017-11-26