본문 바로가기
AI & CS 지식/컴퓨터구조

[혼공컴운] 2. 데이터

by rahites 2024. 7. 14.

데이터

1. 숫자 표현하기

일반적으로 우리가 이야기 하는 데이터라는 단어는 컴퓨터 속에서 0과 1로 표현되며 각각의 데이터는 이른바 정보를 담고 있다.

 

컴퓨터가 이해하는 가장 작은 정보 단위는 비트이다. 우리가 일반적으로 알고 있는 0과 1을 나타내며 1비트는 2개의 정보를 가진다. 당연하게도 2비트, 3비트, ... n비트로 갈수록 표현할 수 있는 정보의 수는 2의 n승으로 늘어난다.

 

1비트를 기준으로 여러개의 비트를 묶어 큰 단위를 정의하였으며 그 단위는 아래와 같다.

1 바이트(byte) 8비트(bit)
1 킬로바이트(kB) 1000 바이트
1 메가바이트(MB) 1000 킬로바이트
1 기가바이트(GB) 1000 메가바이트
1 테라바이트(TB) 1000 기가바이트

바이트를 제외하고는 이전 단위의 1000개를 묶은 것이 다음 단위인 것을 알 수 있으며, 1024개를 묶은 표현은 KiB, MiB, GiB, TiB이다.

 

※ 워드(Word)

- CPU가 한 번에 처리할 수 있는 데이터 크기(ex. CPU가 16비트를 한 번에 처리한다면 1워드 = 8비트)

- 워드의 크기 -> Half Word, Full Word(x1 크기), Double Word

- 워드 크기가 큰 CPU는 한 번에 많은 데이터를 처리할 수 있으며 현재 대다수의 컴퓨터의 워드 크기는 32비트 or 64비트(x32, x64)

 

이진법

이진법은 0과 1만으로 모든 숫자를 표현하는 방법을 말한다. 모두가 중학교 수학시간에 배웠을 내용이며 수학적으로는 $1000_{(2)}$와 같이 표현하지만, 코드 상으로는 0b1000으로 표현한다(예시 숫자는 8).

 

  • 2진수 : 0b
  • 8진수 : 0o
  • 16진수 : 0x

음수의 경우에는 컴퓨터 속에서 마이너스를 표현할 수 없기 때문에 주로 2의 보수를 사용한다.

 

  • 2의 보수 : 어떤 수를 그보다 큰 $2^n$에서 뺀 값

사전적 정의는 위와 같지만, 일반적으로 쉽게 이해하기 위해 주어진 2진수에서 모든 0과 1을 뒤집고 거기에 1을 더한 값이라고 배운다.

예를 들어 $110_{(2)}$를 음수로 표현하고 싶다면 
1. 모든 0과 1을 뒤집는다 : $001_{(2)}$
2. 해당 값에 1을 더한다 : $010_{(2)}$

 

하지만 위와 같은 예시를 들면 한 가지 궁금증이 생긴다.

양수 $010_{(2)}$와 음수 $010_{(2)}$는 어떻게 구분할 수 있을까?

이는 컴퓨터 내부 속에서 플래그를 사용해 양수/음수를 구분한다고 한다(4장에서 자세히 배움!)

 

2의 보수 표현의 한계

 

  • 0이나 $2^n$ 형태의 2진수에 2의 보수를 취할 때 원하는 음수값을 얻을 수 없다(0000 -> 10000).
  • 0과 1만으로 모든 숫자를 표현하기 때문에 길이가 너무 길어진다.

따라서 데이터를 표현할 때 16진법을 자주 사용한다.

 

16진법

16진법에서는 10이 넘어가는 숫자를 한 자리로 표현하기 위해 10~15를 A~F로 표현한다.

 

앞서 언급한 대로 0x로 표기하며 2의 4승이 16이기 때문에 16진수의 한 자리를 4비트의 2진수로 표현할 수 있어 2 -> 16, 16 -> 2진수로의 변환이 편리하다.

 

2. 문자 표현하기

  • 문자 집합 : 컴퓨터가 인식하고 표현할 수 있는 문자의 모음(문자 집합 외의 문자는 이해할 수 없다)
  • 문자 인코딩 : 문자 집합에 속한 문자를 0과 1로 변환하는 과정
  • 문자 디코딩 : 반대로 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정

아스키 코드

아스키 문자 집합이라고 생각할 수 있고 7비트로 표현되어 $2^7$만큼의 정보를 표현할 수 있음

실제로 아스키 문자는 8비트를 사용하지만 그 중 1비트는 오류 검출을 위해 사용되는 Parity Bit

 

하지만 아스키 코드를 가지고는 한글, 특수문자를 표현할 수 없다(8비트로 이루어진 확장 아스키가 등장하기도 했지만 여러 문자를 표현할 수 없었음). 

 

EUC-KR

한글을 표현하는 대표적인 완성형 인코딩 방식

※ 완성형 인코딩이란?
완성형 인코딩 : 한글의 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식
ex. {가: 1, 나: 2, 다:  3}
조합형 인코딩 : 초성, 중성, 종성에 각각의 비트열을 할당하여 이들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식

EUC-KR에서는 한글 단어 하나에 2바이트(16 bit)를 할당(2350개의 한글 단어 표현).

 

하지만, EUC-KR 문자 집합에 정의되지 않은 '쀍', '믜'같은 단어는 표현이 불가능하다.

 

CP949(Code Page 949)

마이크로소프트 제작(모든 나라 언어의 문자 집합과 인코딩 방식을 통일하여 사용하기 위해)

 

Unicode를 사용하였으며 글자에 부여된 값을 여러 방식으로 인코딩하여 사용. UTF(Unicode Transformation Format)-8, 16, 32와 같은 방식이 존재한다. 

예를들어 UTF-8의 경우, Unicode를 인코딩한 결과가 1~4바이트까지 나올 수 있으므로 Unicode 문자에 부여된 값의 범위에 따라 인코딩 결과에 따라 결과 바이트가 결정된다.

출처

강민철, 혼자 공부하는 컴퓨터 구조 + 운영체제, 한빛미디어, 2022

댓글