안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

컴퓨터 구조 (Architecture)/컴퓨터의 개념 및 실습

[Chapter 2] Bits, Data Types, and Operations - 데이터의 표현

피그브라더 2020. 1. 13. 17:48

누구나 귀에 못이 박히도록 들어봤겠지만, 컴퓨터는 내부적으로 모든 데이터를 0과 1로 저장한다. 따라서 CPU의 동작 원리를 이해하기 위해서는 먼저 0과 1에 익숙해질 필요가 있다. 이번 포스팅에서는 0과 1로 이루어진 이진법 체계에 대해 알아본 뒤, 이것이 CPU 구현과는 어떠한 연관을 맺고 있는지까지 한 번 다뤄보도록 할 것이다.

 

1. 데이터를 표현하는 0과 1의 정체

실제로 전압은 연속적인 아날로그 값이지만, 디지털 세계에서는 전압의 크기에 따라 0과 1의 신호를 약속하여 데이터를 표현한다. 예를 들어 0V ~ 0.5V에 해당하는 전압은 0의 신호, 2.4V ~ 2.9V에 해당하는 전압은 1의 신호라고 약속하는 것이다. 그리고 이를 바탕으로 모든 데이터를 0과 1로 이루어진 2진수로 표현한다. 따라서 데이터의 기본 단위는 1비트라고 볼 수 있다. 참고로 N개의 비트를 사용하면 총 2^N개의 서로 다른 상태를 표현할 수 있다. 

 

2. 자료형 (Data Type)

2-1. 자료형의 개념

자료형은 쉬운 듯하면서도 확실하게는 모르고 넘어가기 쉬운 개념이다. 흔히들 자료형이라고 하면 "무슨 유형의 데이터를 표현하는가" 정도로만 알고 있는 듯하다. 하지만 정확히 말하면 자료형이란 '표현하고자 하는 데이터의 특성, 그리고 그러한 데이터들로 수행할 수 있는 연산'이 맞다. int라는 자료형의 의미로는 "정수를 표현하는 자료형"보다 "정수를 표현하고 이를 대상으로 덧셈, 뺄셈의 연산을 할 수 있는 자료형"이 보다 정확하다. 따라서 새로운 자료형을 만들 때도 그 자료형의 데이터로 수행할 수 있는 연산의 종류까지 반드시 결정해줘야 한다.


2-2. 자료형의 표현 방식

자료형의 개념을 이해했다면, 이제 중요한 것은 "각 자료형의 데이터를 비트 위에 어떻게 표현하는가?"이다. 이것까지 결정해야 그 자료형의 데이터를 컴퓨터에서 표현하고 다룰 수 있게 되기 때문이다. 가장 쉬운 예로 자연수를 표현하는 자료형이 있다고 해보자. 그러면 이 자료형은 우리가 이미 알고 있는 2진법대로 표현하면 될 것 같다. 즉 자연수 {1, 2, 3, ...}는 비트 위에 {0001, 0010, 0011, ...}로 표현하면 된다. 또한 이들 간의 덧셈은 우리가 알고 있는 방식 그대로 하면 될 것 같다. 그러면 음의 정수, True/False를 나타내는 논리 값, 소수점이 있는 실수, 문자 등의 자료형은 비트 위에 어떻게 표현해줘야 할까? 이와 같은 주요 자료형들에 대해 주로 채택되고 있는 표현 방식을 한 번 알아보도록 하자.

 

3. 주요 자료형의 표현 방식

3-1. 부호 없는 정수 (Unsigned Integer)

부호 없는 정수 표현 방법 설명
1의 개수로 표현 (Non-positional notation) EX) 숫자 5 → 11111
2진법 (Weighted positional notation) 각 자릿수가 그 자리에 맞는 weight를 가지는 표현 방법. 
N개의 비트로 0부터 2^(N-1)까지 표현 가능. (총 2^N개)

EX) 숫자 5 → 101

3-2. 부호 있는 정수 (Signed Integer)

부호 없는 정수의 경우 그냥 우리가 알고 있는 2진법대로 표현하면 될 것 같다. 그렇다면 음의 정수는 어떻게 표현해줘야 할까? N개의 비트로 표현할 수 있는 값의 개수는 총 2^N개이므로, 이를 음의 정수와 양의 정수가 대략 반반씩 나눠가지는 방식으로 접근한다. 우선 양의 정수는 MSB(Most Significant Bit, 가장 왼쪽 비트)가 0인 것, 음의 정수는 MSB가 1인 것으로 표현하여 2^N개의 값을 반으로 나눠 가지게끔 한다. 그리고 양의 정수는 그냥 2진법대로 표현하면 되고, 음의 정수를 표현하는 방법으로는 다음과 같이 세 가지 방식을 떠올려볼 수 있다. 이 중에서 실제로 채택되는 방식은 2의 보수(Two's complement)이다.

 

음의 정수 표현 방법 설명 문제점
Sign-magnitude MSB를 1로 두고, 나머지는 양의 정수처럼 표현.

EX) 숫자 -5 → 10101
① 0을 표현하는 방법이 두 가지 존재.

② 덧셈을 구현하는 회로가 매우 복잡.
1의 보수
(One's complement)
MSB를 1로 두고, 나머지는 양의 정수 표현식을 Flip하여 표현.

EX) 숫자 -5 → 11010
2의 보수
(Two's complement)
대응되는 양의 정수의 표현식과 덧셈을 했을 때 0이 되게끔 하는 표현식을 찾음. 대응되는 양의 정수의 표현식 전체를 Flip한 뒤 1을 더하면 얻을 수 있음. N개의 비트로 양의 정수는 2^(N-1)-1개, 음의 정수는 2^(N-1)개 표현 가능. 표현할 수 있는 가장 작은 음의 정수인 -2^(N-1)은 대응되는 양의 정수가 존재하지 않음.

EX) 숫자 -5 → 11011
① 0을 표현하는 방법이 한 가지로 유일.

② 덧셈을 구현하는 회로가 단순해짐.

 

3-2-1. 진수 변환

진수 변환 설명
2진수 → 10진수 자릿수에 맞게 2의 지수승을 한 결과값들을 차례로 더하면 된다.
10진수 → 2진수 나눌 수 없을 때까지 2로 나눈 뒤 나머지를 차례로 적으면 된다. 또는 2의 지수승을 큰 것부터 빼봐도 된다.
2진수 -> 16진수 오른쪽부터 4비트씩 묶어서 그 부분을 대응되는 16진수 값으로 바꾸면 된다.

왜일까? 오른쪽부터 시작해서 4비트 크기의 덩어리로 구분해 두었다고 할 때, 오른쪽에서 i번째 덩어리에 해당하는 값은 16^(i-1) x (값 x 2^3 + 값 x 2^2 + 값 x 2^1 + 값 x 2^0)이고, 이는 (값 x 2^3 + 값 x 2^2 + 값 x 2^1 + 값 x 2^0)에 해당하는 16진수 값을 16진수 표현식을 기준으로 왼쪽으로 (i-1)칸 쉬프트한 거랑 같기 때문이다.

 

3-2-2. 부호 있는 정수(2의 보수 기반)의 덧셈, 뺄셈

① 덧셈 : 10진수의 덧셈을 하듯이 오른쪽부터 왼쪽으로 차례대로 더해 나가면 된다.

② 뺄셈 : 2의 보수 방식으로 빼고자 하는 수의 부호를 먼저 바꾼 뒤, 덧셈을 진행하면 된다.

 

3-2-3. 오버플로우 (Overflow), 언더플로우 (Underflow)

N개의 비트는 표현할 수 있는 값의 범위가 한정적이다. 이러한 한계 때문에, N개의 비트로 표현된 두 값을 대상으로 연산한 결과가 N개의 비트로 표현할 수 있는 값의 범위를 넘어서는 경우가 생길 수도 있다. 연산 결괏값이 그 범위의 최댓값을 넘어서는 경우가 오버플로우, 최솟값보다 작아지는 경우가 언더플로우이다. 오버플로우/언더플로우는 ① 두 피연산자의 부호가 같고 ② 연산 결괏값의 부호가 피연산자와 다를 때 발생한다.

 

※ 참고로 두 피연산자를 연산할 때 오버플로우/언더플로우가 발생할지의 여부를 하드웨어 수준에서 판단하는 방법은 의외로 간단하다. MSB로 넘어가는 Carry 값과 MSB에서 바깥으로 넘어가는 Carry 값이 같지 않을 때(XOR 연산 결과가 1일 때) 발생하게 된다.


3-3. 논리 값 (Logical Value)

일반적인 경우에 논리 값(True/False)은 1과 0으로 표현한다. 물론 이러한 논리 값을 대상으로 NOT, AND, OR 등의 연산도 가능하다. 또한 N개의 비트로 이루어진 값들끼리도 NOT, AND, OR 연산이 가능하다. 각 비트에 대해서 독립적으로 연산하면 되기 때문이다.


3-4. 실수 (Fixed-Point number, Floating-Point number)

실수 표현 방법 설명
고정 소수점
(Fixed-Point Number)
소수점 위치를 고정시켜두고, 10진수에서 표현하는 방식과 동일하게 표현. 기존의 덧셈, 뺄셈 논리 회로를 그대로 활용할 수 있다는 특징이 있지만, 매우 큰 수와 매우 작은 수를 표현하기에는 상당히 제한적이어서 잘 사용되지 않음.

EX) 숫자 40.625 → 00101000.101
EX) 숫자 -1.25 → 11111110.110
부동 소수점
(Floating-Point Number)
※ IEEE 754 협회의 Floating-Point Standard (32비트) 기준

가장 왼쪽 1비트 (S) : 부호(Sign) 비트
그 다음 8비트 (E) : 지수(Exponent) 비트
그 다음 23비트 (F) : 가수(Fraction) 비트

N = (-1)^S x 1.F x 2^(E-127) (if 1 <= E <= 254)
N = (-1)^S x 0.F x 2^(-126) (if E = 0)
N = Infinity (if E = 255)

허용 범위 내의 실수는 다음과 같은 규칙으로 비트 위에 표현될 수 있다. 

① 양수이면 S에 0을, 음수이면 S에 1을 채운다.

② 절대값을 이진법으로 나타낸다.

③ 소수점을 왼쪽으로 이동시켜 소수점 왼쪽에는 1만 남게 만든다. (정규화)

④ 소수점 오른쪽에 위치한 비트들이 가수에 해당한다. 여기에 부족한 비트만큼 오른쪽에 0을 붙여서 F를 채워준다.

⑤ 정규화 식에서의 지수에 127을 더한 값을 2진법으로 표현한 뒤 E에 채워준다. 만약 정규화 식에서의 지수가 -127이면 소수점을 왼쪽으로 한 칸 더 이동하여 F를 수정해주고 E에는 0으로만 채워준다.

3-5. 문자 (Character)

각 문자에 특정 길이의 비트 열을 일대일 대응시킴으로써 문자를 표현한다. 아스키 코드나 유니 코드가 국제적으로 많이 사용되는 대표적인 문자 코드 체계이다. 예를 들어 아스키 코드 체계에서 a라는 문자는 16진수로 61에 대응되고, z라는 문자는 16진수로 7a에 대응된다. 아스키 코드나 유니 코드의 표는 직접 검색을 통해 한 번 알아보길 바란다.

 

4. LC-3의 자료형

LC-3는 우리가 앞으로 공부할 가상의 ISA(기계어 체계)이다. 즉 LC-3도 하나의 ISA이기 때문에 지원하는 자료형의 종류와 개수가 정해져 있다. 그렇다면 LC-3에서는 무슨 자료형이 지원될까? 교육용 가상 언어답게, '16비트 2의 보수 부호 있는 정수'만 지원되며, 이에 대한 연산으로는 ADD, AND, NOT이 지원된다. 다른 자료형들의 경우에는 동일한 16비트 값을 상황에 따라 다르게 해석함으로써 구현하게 된다.