본 내용은 컴퓨터 아키텍처 - 컴퓨터 구조 및 동작 원리 책(한빛아카데미)을 바탕으로 정리하였습니다.
Index
- 1. 데이터의 개요
- 2. 정수
- 3. 실수
- 4. 비수치 데이터
- 5. 디지털 논리회로
1. 데이터의 개요
우리는 코드를 짤 때마다 항상 어떤 데이터를 쓸지 고민하게 된다.
예를 들자면, 프로그래밍 문제에서 입력 값이 21억이 넘어간다면 long long, 실수형이라면 float, 문자열이라면 string처럼 말이다.
컴퓨터는 이러한 데이터들을 처리하는 장치이다.
하지만 모든 형식의 데이터를 표현할 수 없기 때문에 형식이 제한되어있다.
1.1 데이터의 종류
컴퓨터가 사용하는 데이터는 위 그림과 같이 수치 데이터와 비수치 데이터로 구분할 수 있다.
간단히 다음과 같이 정리할 수 있다.
수치 데이터는 컴퓨터의 내부적 표현으로 산술연산과 논리 연산에 직접 사용되고
비수치 데이터는 컴퓨터의 외부적 표현으로, 산술연산에 사용되는 수치 데이터를 제외한 모든 문자, 기호, 한글 등을 코드로 나타낸 것이다.
1.2 데이터의 형식
데이터 형식은 컴퓨터가 지원하는 데이터의 표현 방식이라고 할 수 있다.
더 자세히 말하자면, 컴퓨터에서 제공하는 명령어 집합으로 연산할 수 있는 정보의 표현이다.
컴퓨터에서 사용할 수 있는 데이터 형식은 매우 다양한데 두 가지로 나뉜다.
- 간단한 데이터 형식은 boolean, int, float 등이 있고
- 복잡한 데이터 형식은 string, vector, queue, stack 등 자료구조 수업 때 배울만한 것들이 있다.
하지만 모든 아키텍처가 모든 데이터 형식을 지원하는 건 아니라는 점을 명심하자.
1.3 데이터와 진법
진법은 유한한 심볼로 아주 큰 숫자들까지 표현하는 방법을 일컫는다.예컨대, 우리가 매일 사용하는 10진법의 경우, 0~9까지의 숫자를 이용해 수십, 수백, 그 이상에 이르는 숫자들까지 모두 표현 가능하다.
컴퓨터는 전기 신호를 통해 소통하므로 기본적으로 2진법을 사용하는데
보통 전기 신호가 통할 때 '1', 그렇지 않을 때 '0'으로 간주한다.
컴퓨터는 이러한 방식으로 모든 데이터를 저장하고 처리할 수 있게 된다.
진법 간 변환 방식(특수)
보통 우리는 a진법에서 b진법으로 변환할 때 (a,b != 10) a를 10진법으로 변환하고 다시 b진법으로 변환하는 방식을 택하게 된다. 그런 방향이 우리 눈에 보기 좋기 때문이다.
그런데 특수 상황에서는 바로 a->b 진법으로 변환하는 게 더 보기 좋게 느껴질 수 있다.
- 2진법 -> 8진법 : 2진법의 비트 3개는 8진법의 비트 1개이기 때문에 2진법에서 3개씩 묶어 8진법으로 표현하면 깔끔하다. 묶다가 남은 수는 그냥 앞에 써주자. ex. 1111011(2) -> 173(8)
- 16진법 -> 2진법 : 위와 비슷한데, 반대 case이다. 16진법으로 표현된 비트들을 4 비트로 쪼개 나눠주자.
ex) ff(16) -> 11111111(2)
데이터의 물리적 단위
언제 어떤 글을 본 적이 있었는데, 메모리 제조 회사에서 측정법이 다른 걸 이용해 1기가를 1000MB로 팔고 1 테라를 1000GB로 판다는 것이다. 이렇게 보면 단지 24MB, 24GB 차이인 건데 왜 그러지? 싶을 수 있으나
만약 100년 뒤 요타바이트 메모리를 판다고 했을 때 이런 차이는 24ZB = 약 24 * 2 ^ 40 TB의 차이가 된다.
호구가 되지 않도록 주의해서 읽어보자..
2. 정수
정수는 표현된 숫자의 가장 오른쪽에 소수점이 고정되어 있기 때문에 고정 소수점 수라고 부른다.
컴퓨터에서 정수는 반복문의 제어 변수, 배열의 색인 값 등과 같은 정확한 계산에 사용된다.
2.1 무부호 정수의 표현
정수는 0과 양수, 음수로 구성되는데, 0과 양수만 포함하는 정수를 무부호 정수(unsigned int)라 하고 음수까지 포함할 경우 유부호 정수(signed int)라고 한다.
무부호 정수의 경우 음수를 표현하지 않아도 되기 때문에 n bit의 경우 그대로 2^n 개의 숫자로 표현 가능하다.
2.2 유부호 정수의 표현
k비트로 유부호 정수를 표현하려면 2^k개의 표현 가능한 수에서 0을 제외한 2^k - 1개의 절반을 양수로, 나머지 절반을 음수로 표현하면 된다. 하지만 2^k - 1개는 홀수라 나누어 떨어지지 않기 때문에 0을 두 가지 (-0, 0)로 표시하든지, 아니면 양수, 음수가 비대칭이 될 수밖에 없다.
아래는 나누는 방법론을 설명한다.
1) 부호-크기 표현 방식
부호-크기 표현 방식은 MSB(Most Significant Bit)를 부호 비트를 사용하고, 나머지 비트는 크기로 사용한다.
MSB가 0일 때는 양수를, 1일 때는 음수를 나타낸다.
따라서 한 비트는 MSB로 사용되므로 n bit의 표현 가능 범위는 -2^(n-1) + 1 ~ 2^(n-1) - 1이다.
장점
MSB만 바꾸면 양수를 음수로, 음수를 양수로 변환 가능하다.
단점
연산 시 MSB를 별도로 점검해야 하고, 0과 -0이 동시에 존재한다.
2) 1의 보수
우선 1의 보수를 설명하기 전에, 보수에 대해 알아보자.
보수란?
"보수"를 구글에 치면, 보수란 "어떤 수를 보충해주는 수"라고 나온다.
이는 부족한 부분을 메워 준다는 의미인데
만약 4의 경우, 10 단위 수(10, 100, 1000)가 되기 위해 +6이 필요하므로, 4에 대한 10의 보수는 6이다.
만약 9 단위 수 (9, 99, 999)가 되려면 +5가 필요하므로, 4에 대한 9의 보수는 5이다.
1의 보수 방식
1의 보수 방식은 매우 간단하다. 각 비트를 0은 1로, 1은 0으로 상호 반전시키는 것이다.
이 경우, 만약 4bit 정수의 경우 1(0001)의 1의 보수 -1은 (1110)이 된다.
장점
음수와 양수 사이 변환이 매우 용이하다. (n bit의 경우 (2^n - 1) - x)
단점
이 또한 마찬가지로 두 가지 0이 존재한다. +0(0000), -0(1111)
3) 2의 보수
2의 보수 방식은 1의 보수 결과에서 +1을 추가하면 된다.
예를 들어 +0(0000) -> (1111 + 0001 = 0000) 이런 방식으로 기존 2개가 존재했던 0을 1개로 줄일 수 있고,
이런 영향으로 음의 정수를 1 크게 표현할 수 있게 된다. (4bit -> -8 ~ 7)
2.3 2의 보수 방식의 대중성
앞서 살펴본 3가지 방식은 각각 장점과 단점을 가지고 있다.
하지만 현대 컴퓨터 아키텍처는 왜 2의 보수 방식을 사용할까?
- 부호-크기 방식 : 두 숫자의 부호에 따라 연산 방법이 다르고(MSB에 따라), 0이 2개 존재해 이상적인 명령어 집합 구조의 조건을 만족시킬 수 없다.
- 1의 보수 : 부호와 상관없이 연산이 가능하지만, 2개의 0이 있기 때문에 MSB에서 올림수가 발생하면 결과에 올림수를 더하는 순환 자리올림을 해야 한다.
-> 하지만 2의 보수는 위 단점이 없고 다만 비대칭성이 있긴 하나, 표현의 유일성이 더 중요하기 때문에 대부분 시스템에서 2의 보수 방식으로 정수를 표현한다.
3. 실수
3.1 실수의 개요
실수는 정수 및 연속한 두 정수 사이의 모든 수를 의미한다.
컴퓨터에서는 실수를 부동 소수점 수로 표현하며, 실수 V는 다음과 같이 4개의 구성 요소를 사용하여 나타낸다.
여기서 S는 부호, m은 소숫값인 가수, r은 밑, e는 지수를 의미한다.
만약 S가 0, m이 3.14, r이 10, e가 -2라면, (+)(3.14 x 0.01) -> 0.0314 가 되겠다.
4. 비수치 데이터
4.1 BCD 코드
BCD 코드는 2 진화 10진 코드라고도 불리며 숫자, 알파벳, 특수 기호를 나타내기 위해 6비트로 구성된 코드이다.
실제로는 오류 검출용 패리티(parity)를 위한 1비트를 포함하여 7비트로 구성된다.
4.2 아스키코드(ASCII)
아스키코드는 미국국립표준연구소가 제정한 알파벳을 사용하는 대표적인 문자 코드이다.
표준 ASCII 코드는 아래와 같다.
4.3 유니코드
유니코드는 다국적 알파벳을 대부분 포함하기 위해 하나의 문자를 16비트 체계로 구성한 코드로서
만국 공통의 국제 문자 부호 체계를 의미한다.
현재 대부분의 시스템이나 애플리케이션에서 점진적으로 ASCII 코드를 대신하고 있다.
'Computer Architecture' 카테고리의 다른 글
6. 디지털 논리회로와 연산장치 (0) | 2020.12.09 |
---|