본문 바로가기

컴퓨터 공학(Computer Engineering)/자료구조(Data Structure)

65 83 67 73 73, 이것은 컴퓨터의 글자다. [컴퓨터의 숫자와 문자 표현]

컴퓨터는 2진수를 이용해 자료를 표현한다. 2진수는 0과 1이 한 자릿수를 이루는 숫자 체계로, 1011(2)의 경우 십진수로 나타내려면 다음과 같다.

 

(23 * 1) + (22 * 0) + (21 * 1) + (20 * 1)

= 8 + 0 + 2 + 1

= 11

 

컴퓨터는 2진수를 기반으로 8진수, 16진수 등 다른 진수 기반의 수를 표현 가능하다. 그러나 지금 이 글 또한 컴퓨터가 나타내는 문자이듯 컴퓨터는 문자 또한 표현이 가능해야 한다. 컴퓨터에서는 이를 어떻게 표현하고 다루는지 몇 가지 경우들을 알아보도록 하자.


수치 자료(Numeric Data)

1. 10진수

우선 우리가 현실세계에서 흔히 쓰는 10진수 연산을 위한 방법들이 있다. 팩(Pack) 형식과 언팩(Unpack 또는 Zone) 형식이 대표적인 예로서, 이들은 4bit를 십진수의 한 자리로 이용하고 부호 표현을 덧붙이는 등의 방식으로 십진수를 표현한다. 자릿수마다 4bit인 이유는 1bit는 2(0~1), 2bit는 4(0~3), 3bit는 8(0~7), 4bit는 16(0~15)만큼 표현이 가능한데, 10개 이상의 수를 담을 수 있는 최소한의 비트가 4bit이기 때문이다.

 

우선 팩 형식은, 4bit마다 십진수 한 자리씩을 표현하고, 마지막 4bit에 부호를 표시해준다. 부호는 +일 경우 C, -일 경우 D, 부호가 없다면 F로 나타낸다.

 

언팩 형식은 8bit를 4bit는 zone, 나머지 4bit는 digit으로, digit에는 십진수 한 자리씩 들어가고 마지막 zone에는 부호가 표시되며 나머지 zone에는 F를 채워넣는다.

 

1357의 팩, 언팩형 표현

0001(1) 0011(3) 0101(5) 0111(7) 1111(F, 부호 없음)
1111(F) 0001(1) 1111(F) 0011(3) 1111(F) 0101(5) 1111(F, X) 0111(7)

+1357의 팩, 언팩형 표현

0001(1) 0011(3) 0101(5) 0111(7) 1100(C, +)
1111(F) 0001(1) 1111(F) 0011(3) 1111(F) 0101(5) 1100(C, +) 0111(7)

-1357의 팩, 언팩형 표현

0001(1) 0011(3) 0101(5) 0111(7) 1101(D, -)
1111(F) 0001(1) 1111(F) 0011(3) 1111(F) 0101(5) 1101(D, -) 0111(7)

 

4bit에 십진수 한 자리를 저장하는 팩 형식은 컴퓨터 내부적으로 연산을 위해 사용하는 형식이고 입출력이 불가능한 반면, 1Byte(8bit)에 십진수 한 자리를 저장하는 언팩(또는 Zone) 형식은 디스크 저장 또는 입출력을 위한 형식이다. 

 

2. 2진수

다음으로 2진수 표현과 연산을 위한 방법으로, 단순히 음양 구분 부호를 붙이거나 1의 보수, 2의 보수를 이용하는 방법이 있다. 보수를 이용하면 더하기만으로 뺄셈이 가능해 가산기(Adder, 더하기를 가능하게 해주는 회로)만을 이용해 사칙연산이 가능해 효율적이다. 잠깐 보수에 대해 설명하면, 이진수의 1의 보수는 어떤 이진수의 0과 1을 모두 바꿔주면 되고, 2의 보수는 어떤 이진수의 1의 보수에 1을 더해주면 된다. 예를 들어, 십진수 7이 4bit에 저장된 경우 이진수로는 0111, 1의 보수는 1000, 2의 보수는 1001이다.

 

부호 비트

우선 부호 비트를 두어 0이면 양수, 1이면 음수를 나타내는 방식은 가장 간단하긴 하지만 +0과 -0이 모두 존재하며 가산기와 감산기가 모두 필요한 단점이 있다. 이 방식의 표현 범위는 다음과 같다.

1111 ~ 0111 (1111 = -7, 0111 = 7, 1000 = -0, 0000 = +0)

-(2n-1-1) ~ (2n-1-1), ±0

예를 들어 십진수 +12, -12를 이 방식의 이진수로 각각 표현할 경우 01100, 11100이 된다.

 

1의 보수

1의 보수를 이용한 방법은 가산기만으로 모든 연산이 가능하나 올림수가 발생해 더해줘야 할 경우가 있으며, +0과 -0이 여전히 존재한다. 이 방식의 표현범위는 다음과 같다.

1000 ~ 0111 (1000 = -7, 0111 = 7, 0000 = -0, 1111 = +0)

-(2n-1-1) ~ (2n-1-1), ±0

이 방식을 이용해 12-4를 계산할 경우 12(1100)는 양수이므로 그대로 두고, 4의 경우 음수이므로 보수로 바꿔(0100 -> 1011) 둘을 더해주면 1100 + 1011 = 0111(올림수 1)이고, 올림수가 발생했기 때문에 올림수 1을 더해주면 1000(8)이 된다.

 

2의 보수

마지막으로 2의 보수를 이용한 방법은 가산기만으로 모든 연산이 가능하며 올림수 발생시 그냥 버리면 되므로 연산 속도도 1의 보수에 비해 더 빠르다. 또한 +0만 존재해 숫자 하나를 더 표현 가능하다는 장점도 있다. 표현 범위는 다음과 같다.

1000 ~ 0111 (1000 = -8, 0111 = 7, 0000 = 0)

-(2n-1) ~ (2n-1-1), +0

이 방식을 이용해 12-4를 계산할 경우, 12(1100)는 그대로 두고 4는 음수이므로 2의 보수로 변환(0100 -> 1100)한 뒤 둘을 더하면 1100 + 1100 = 1000(올림수 1)이고, 올림수는 버리면 되므로 1000(8)이 된다.

 

3. 실수(Real Number)의 표현

컴퓨터의 실수 표현법은 고정소수점(Fixed Point)과 부동소수점(Floating Point)이 있다. 고정소수점은 정수부와 실수부가 정해진 표현으로, 부호 비트와 정수 비트, 소수 비트를 나눠 놓은 직관적이고 단순한 표현방식이다. 다만 이 표현방식은 표현 범위가 작고 정밀도도 떨어져 하여튼 잘 사용하지 않는 방식이라고 보면 된다. 부동소수점은 이와는 달리 정규화(Normalization)와 함께 비트를 지수부(Exponential)와 가수부(Fraction/Mantissa)로 나누어 지수부의 크기를 유연하게 조절하여 정밀도와 유효숫자를 조절하는 방식이다.

 

간단히 비교를 해보자면, 고정 소수점은 5.5라는 수를 5는 정수 비트에, 5는 소수 비트에 저장하는 방식이다. 즉, 5.5는 이진수로 101.1이 되고, 101을 정수부에, 1을 소수부에 저장한다. 반면 부동소수점은 5.5를 이진수 101.1 그대로 이용하는 것이 아니라 우선 정규화 과정을 거치는데, 정규화는

101.1

= 10.11 * 2

= 1.011 * 22

이와 같이 정수부에 1이 하나만 남도록 변환하는 방식을 뜻한다. 이 때 소수점은 고정된 것이 아니라 움직이게 된다.

 

잠깐 10진수 실수의 2진수 변환법에 대해 알아보자.
12.625라는 십진수가 있을 때, 우선 12는 정수부로서,

12 / 2 = 6 -> 나머지 0
6 / 2 = 3 -> 나머지 0
3 / 2 = 1 -> 나머지 1
1 / 2 = 0 -> 나머지 1

0이 될 때까지 나누어주고, 그 과정에서 나온 나머지를 거꾸로 적어주면 된다.

소수부의 계산은

0.625 * 2 = 1.25 -> 1
0.25 * 2 = 0.5 -> 0
0.5 * 2 = 1.0 -> 1

이렇게 소수부가 전부 0이 될 때까지 2를 곱해주고, 중간 과정에서 1이 넘는 수가 있으면 1을 표시하고 소수만 다시 2를 곱해나가는 방식으로 계산한 다음 위에서부터 순서대로 적어주면 된다.

즉, 12.625는 이진수로 1100.101이다. 결과를 풀어서 나타내보면
(23 * 1) + (22 * 1) + (21 * 0) + (20 * 0) + (2-1 * 1) + (2-2 * 0) + (2-3 * 1)
= 8 + 4 + 0 + 0 + 0.5 + 0.0 + 0.125
= 12 + 0.625 = 12.625

 

정규화된 이진수의 값은 가수부로, 크기는 지수부로 가게 된다. 지수부는 bias를 이용해 표현하는데, bias는 지수부 비트가 k일 경우 2k-1이며, 지수부는 bias에 지수 승수만큼 더한 값이 된다. 예를 들어 설명해보자면, 1.011 * 20(= 2.375)인 경우 지수부는 bias값 그 자체가 되고(0승), 1.011 * 22(12.5)인 경우 지수부는 bias + 2가 된다. 달리 말해, 지수부 값이 0인 경우는 1.011 * 2-bias라는 말이 된다. bias를 이용하는 이유는 양수만 이용해 지수의 음양을 모두 표현하기 위해서이며, 이때 표현 가능한 지수부의 범위는

2-bias ~ (2bias - 1)이다.

(지수부 4bit일 경우, bias = 24-1 = 8, 0000 = -8 ~ 1000 = 0 ~ 1111 = 7)

 

부동소수점은 IEEE 754에 정의되어 있는데, 단정밀도(Single Precision, 32bit float)와 배정밀도(Double Precision, 64bit double)가 있으며, 각각의 공간은 다음과 같이 나뉘어진다.

 

Single Precision

부호 1bit 지수부 8bit, bias = 27 = 127 가수부 23bit

Double Precision

부호 1bit 지수부 11bit, bias = 210 = 1024 가수부 52bit

 


문자 자료(Character Data)의 표현

컴퓨터의 문자 표현은 큰 틀에서 결국 2진수 각 숫자를 어느 문자로 대응시키느냐 하는 것이다. 그 방법들은 특별한 계산식이 있기보다는 하나의 약속이므로, 간단히 몇 가지를 소개한다.

 

BCD(Binary Coded Decimal) code

  • zone 2bit와 digit 4bit 총 6bit로 구성되어 26만큼의 문자 표현이 가능하다.

EBCDIC(Extended Binary Coded Decimal Interchange) code

  • BCD code에 zone 2bit를 추가로 더해 8비트로 하나의 문자를 표현한다.

ASCII(American Standard Code for Information Interchange) code

  • parity 1bit, zone 3bit, digit 4bit 총 8bit로 구성된 27만큼의 문자 표현이 가능한 방식이다.

ASCII code

이제 제목의 비밀을 밝힐 때가 왔다. 65 83 67 73 73, 이것은 ASCII code표를 참고하면 'ASCII'가 된다. ASCII는 특히 C언어 등 많은 곳에서 기본으로 이용하니까 중요하다고 할 수 있다.