코딩스토리

Chapter 5. 데이터 표현 본문

컴퓨터구조

Chapter 5. 데이터 표현

kimtaehyun98 2020. 12. 3. 17:35

# 본 내용은 한국항공대학교 길현영 교수님의 '컴퓨터 구조' 강의 및 컴퓨터 아키텍처(우종정, 한빛 아카데미)를 바탕으로 작성한 글입니다.

 

1. 데이터의 개요

 

1. 데이터의 종류

 

컴퓨터에서 사용하는 데이터는 수치 데이터, 비수치 데이터 두 가지로 나눌 수 있다.

수치 데이터는 컴퓨터의 내부적 표현으로 산술 연산이나 논리 연산에 직접 사용된다.

비수치 데이터는 컴퓨터의 외부적 표현으로, 산술연산에 사용되는 수치 데이터를 제외한 모든 문자, 기호 한글 등을 코드로 나타낸 것이다.

 

데이터 종류

 

2. 데이터의 형식

 

데이터 형식은 컴퓨터가 지원하는 데이터의 표현 방식이다.

정확한 의미는 컴퓨터에서 제공하는 명령어 집합으로 연산할 수 있는 정보의 표현이다.

 

모든 컴퓨터가 모든 데이터 형식을 지원하진 않는다.

이유는 하드웨어의 복잡성과 비용 증가 때문이다.

아키텍처 마다 지원하는 데이터 형식의 종류가 다를 수 있으며 대부분의 아키텍처는 적은 수의 데이터 형식을 지원한다.

 

그렇다면 내가 사용하는 컴퓨터가 지원하지 않는 데이터 형식을 사용하고 싶다면 새로운 컴퓨터를 사야 할까?

이런 점을 소프트웨어가 해결해준다고 한다.

 

3. 데이터와 진법

 

컴퓨터는 데이터를 두 가지 상태로만 표현할 수 있다.

즉 컴퓨터는 기본적으로 2진법을 사용한다.

모든 프로그램 코드나 데이터가 2진법 형식으로 저장되고 처리된다.

 

우리가 알고 있는 2진수는 '0' 또는 '1'로 숫자를 표현하는 진법이다.

이때 컴퓨터에서 2진수의 한 자리를 비트(binary digit)라고 하며

대부분의 경우는 최소 단위로 1byte(8bit)를 사용한다고 한다.

(1byte = 8bit란 말은 0~2^8-1까지의 값, 즉 255까지의 값을 저장항 수 있다. -> 11111111(2) = 255)

 

그럼 데이터를 처리할 때 2진수만 사용하는가 살펴보면 그렇지 않다.

 

만약 모든 데이터를 비트로 나타내면 데이터를 출력, 처리할 때 비효율적이다.

 

이 때 8진수와 16진수가 사용되는 데 사용 예는 아래 그림과 같다.

 

8진수 사용예

살펴보면 2진수 1101은 8진수로 15로 나타낼 수 있다. 

특징은 2진수를 3개씩 묶어서 사용하고 있음을 알 수 있다.

8진수의 15를 10진수로 나타내 보면 8^1*(1) + 8^0*(5) = 13 즉 1101(2)과 같음을 알 수 있다.

 

16진수 사용예

16진수도 8진수와 마찬가지로 2진수를 4개씩 묶어서 사용한다.

 

이 이상의 진법 간의 변환은.. 굳이 다루지 않아도 될 것 같다.

 

데이터의 물리적 단위는 간단하게 보면 다음 표와 같다.

 

데이터의 물리적 단위

우리가 가장 자주 쓰는 MB와 GB가 약 10^6, 10^9 바이트란 것만 알고 넘어가자.

 

 

4. 정수 표현

 

정수는 양의 정수, 0, 음의 정수로 이루어져 있다.

따라서 양의 정수와 0을 포함하는 정수를 무부호 정수, 음의 정수까지 포함하면 유부호 정수라고 한다.

 

정수 표현은 고정 소수점 형태를 사용한다.

이게 뭔 소린지, 왜 필요한지 한참 생각했는데, 뒤의 실수(부동 소수점 형태)와 비교하려면 필요한 것 같다.

 

먼저 무부호 정수 표현부터 살펴보자.

무부호 정수, 즉 양수는 2진수로 쉽게 표현 가능하다.

주의할 점은 n bit의 경우 2^n 개의 숫자를 표현 가능하다는 점이다.

 

컴퓨터에서 무부호 정수 표현만 가능하다 하면 당연히 말도 안 되는 이야기이다.

그렇기에 음수까지 표현이 가능한 정수 표현 방법이 존재한다.

 

유부호 정수 표현법에는 크게 3가지가 있다.

 

  • 부호-크기 표현
  • 1의 보수 표현
  • 2의 보수 표현

지금부터 하나씩 알아보자.

 

1) 부호-크기 표현법

 

먼저 유부호 정수를 표현하려면 무조건 부호를 나타내는 방법이 필요할 것이다.

 

부호-크기 표현법에서는 MSB(Most Significant Bit), 즉 최상위 비트를 부호 비트로 사용한다.

(양수는 0, 음수는 1)

 

최상위 1 비트를 부호 비트로 사용하기 때문에  n bit의 경우

-(2^(n-1)-1)  ~  -0,  +0,   ~ +2^(n-1)-1의 숫자를 표현 가능하다.

 

여기서 궁금증은 -0은 뭔가?인데 생각해보면 당연한 것이다.

예를 들어 3bit라고 했을 때 100(2)과 000(2)은 같은 수라고 할 수 있을까?

물론 사람은 -0이나 0이나 둘 다 0이야!라고 쉽게 말할 수 있지만 컴퓨터는 그렇지 못하다.

 

따라서 이런 부분이 단점이 되고,  연산 수행 시 부호를 별도로 점검해야 된다.

 

장점은 부호 비트가 따로 존재하기 때문에 부호 비트만 바꿔주면 음수, 양수로 바꿀 수 있다.

 

보수

 

보수 방식의 표현법을 공부하기 전에 잠시 보수에 대해 알아보자.

 

보수의 어원적 의미는 '상호 보완하는 수'로 어떤 수를 보완해주는 다른 임의의 수이다.

 

n진법에서는 n-1의 보수와 n의 보수가 존재한다고 한다.

 

  • A에 대한 (n-1)의 보수 B: 두 개의 숫자(A, B)들을 더한 결과값의 각 자리가 (n-1)가 됨
  •    예시: 237에 대한 9의 보수?    237 + x = 999 = (1000-1) → x = (1000-1) – 237 = 762
  • A에 대한 n의 보수 B: 두 개의 숫자(A, B)들을 더한 결과값의 각 자리마다 자리 올림이 발생하고 해당 자리는 0이 됨
  •    예시: 237에 대한 10의 보수?   237 + x = 1000 → x = 1000 – 237 = 763

보수를 사용하는 이유는 뺄셈을 하는 새로운 HW를 구현하지 않고, 기존의 Adder를 통해서 연산할 수 있기 때문이다.

 

 

2) 1의 보수 표현법

 

n bit의 2진수인 경우 1의 보수는 아래와 같이 나타낼 수 있다.

 

x에 대한 1의 보수 = (2^n) - x = 2^n - x - 1 

 

이때 2^n - 1은 111....111 로 나타낼 수 있으므로 이 수에 x를 뺀다면 결국 각 bit를 1->0, 0 ->1로 바꿔준 것과 동일하다.

 

이게 말로 설명하려니까 힘든데 예시를 들자면

 

ex) n = 5일 경우 2^5-1 = 11111(2) 이다.

이때  x = 4라고 했을 때 -4는 11111 - 00100 = 11011이 된다는 것이다.

 

이 표현법 또한 n bit의 경우 -(2^(n-1)-1)  ~  -0,  +0,   ~ +2^(n-1)-1의 숫자를 표현 가능하기 때문에 

-0(1111), +0(0000)에 대한 처리를 따로 해줘야 한다는 단점이 생긴다.

 

장점으로는 반전만 시켜주면 되기 때문에 음수 양수 변환이 용이하다는 점이다.

 

3) 2의 보수 표현법

 

n bit정수의 경우 2의 보수는 아래와 같다.

 

x의 2의 보수 = 2^n - x

 

ex) n=4 : 2^4 = 10000(2)

      -2 = +2 (0010)2의 보수 = 10000(2) – 0010(2) = 1110(2)

 

2의 보수를 쉽게 구하는 방법은 (디지털 논리 시간에 배웠지만)

아무래도 1의 보수에 +1 하는 게 가장 쉬운 방법이 아닌가 싶다.

증명?은 1의 보수 (2^n -1) - x에 +1을 하면 2^n - x, 즉 2의 보수가 나오는 걸 알 수 있다.

 

2의 보수 표현법의 경우 -2^(n-1)   ~   0,   ~ +2^(n-1)-1의 수를 표현 가능하다.

 

눈에 띄는 점은 -0이 사라졌다는 것인데

이유는 0(0000)의 2의 보수는 10000인데 4bit라면 결국 -0 또한 0000이 되기 때문에 +0 = -0 = 0 이 된다.

이렇게 0이 하나만 존재한다는 것이 장점이다.

 

단점이라고 하면 1의 보수에 1을 추가해야 한다는 점이 있지만 단점이라 하기엔 애매한 것 같다.

 

 

이제 유부호 정수 표현법을 3가지나 알아봤다.

그렇다면 어떤 표현법이 가장 많이 사용될까?

 

먼저 부호-크기 방식은 두 숫자의 부호에 따라 연산의 방법이 달라진다.

예를 들어 동일한 부호라면 크기 부분은 더하고, 부호 비트만 추가하면 되지만

부호가 다르다면, 크기 부분의 차이를 구하고 크기가 큰 수의 부호를 적용해야 한다.

즉 차이를 구하는 연산이 필요하기 때문에 뺄셈 장치가 필요하게 된다.

 

1의 보수 표현법은 부호와는 상관없이 연산이 가능하지만 순환 자리올림이 발생한다.

만약 MSB에서 올림수가 발생한다면 연산 결과에 올림수를 더해줘야 한다.

 

위의 그림에서 보면 -3과 -1을 더하면 1의 carry가 생긴다. 

이때 이 carry를 버리면 1010, 즉 -5란 엉뚱한 답이 나오게 된다.

즉 carry를 더해줘야지만 제대로 된 답을 구할 수 있다.

(carry가 생기는 이유는 2개의 0 때문에 발생한다고 한다.)

 

 

마지막으로 2의 보수 표현법은 위의 표현법들에서 언급된 단점이 존재하지 않는다.

2의 보수로 변환시키는 과정이 한 단계 더 필요하지만, 덧셈 장치만으로 계산이 가능하고

0이 한 개이기 때문에 순환 자리올림 역시 발생하지 않는다.

 

이러한 점 때문에 대부분 시스템에서 2의 보수 방식으로 정수 표현을 한다고 한다.

 

 

5. 실수 표현

 

실제로 실수를 표현하는 방법은 무수히 많다.

같은 실수라도 사람에 따라 여러 방식으로 표현한다. 

예를 들자면 1.001이라는 실수가 있다면 10.01 * 10^-1으로도 표현할 수 있다는 점이다.

 

컴퓨터는 표준화된 방식이 필요하기 때문에 모든 실수를 정규화시켜서 표현한다.

정규화는 소수점 왼쪽에 있는 수를 0이 아닌 한자리 수로 제한시키는 것으로 가능하다.

 

이때 데이터의 일반적인 형식은 다음과 같다.

만약 소수점 왼쪽의 정수 값이 0이 되거나 1bit를 넘는다면 정규화에 어긋나므로 Shift연산을 통해 정규화시켜주면 된다.

 

 

6. 비수치 데이터

 

BCD코드

 

2 진화진 코드라고도 불림

숫자, 알파벳, 특수 기호를 나타내기 위해 6 bit로 구성된 코드 (2^6 표현 가능)

 • 실제로는 오류 검출용 패리티를 위한 1 bit를 포함하여 7 bit로 구성

 

유니코드

 

다국적 알파벳을 대부분 포함하기 위해 하나의 문자를 16 bit 체계로 구성한 코드

 •ASCII 코드는 8 bit 코드로 다양한 문자를 표현하는데 한계

만국 공통의 국제 문자 부호 체계(UCSUniversal Code System)를 의미

 •그러나, 영어권에서는 불필요한 데이터 발생

 

현재 대부분의 시스템이나 애플리케이션에서 점진적으로 ASCII코드를 대신하는 추세

 

즉 요약하면 BCD코드(7bit) -> ASCII코드(8bit) -> 유니코드(16bit) 순으로 발전했다!

 

 

 

 

 

 

 

 

 

 

 

Comments