본문 바로가기
CS 공부/컴퓨터 구조, 운영체제

컴퓨터 구조(2) - 데이터

by 프롭 2026. 1. 26.

 

0과 1로 숫자를 표현하는 방법

 

정보 단위

컴퓨터가 이해할 수 있는 가장 작은 정보 단위를 알아보자.

0과 1을 나타내는 가장 작은 정보 단위를 비트라 한다.

전구에 빗대어 얘기하면 전구 한 개로는 (꺼짐), (켜짐) 두 가지 상태를 표현할 수 있듯 비트는 0과 1, 두 가지 정보를 표현할 수 있다.

2비트는 몇 개의 정보를 표현할 수 있을까?

00, 01, 10, 11과 같이 네 가지 상태를 표현할 수 있는 것처럼

n 개의 비트라면 2^n 가지 정보를 표현할 수 있다.

 

프로그램의 크기를 말할 때는 표현의 편의를 위해 비트보다 큰 단위를 사용한다.

바이트, 킬로바이트, 메가 바이트, 기가바이트, 테라바이트 등이 있다.

바이트(byte)는 8개의 비트를 묶은 단위이고 1바이트를 1,000개를 묶은 단위를 1킬로바이트(kB), 1킬로바이트를 1,000개를 묶은 단위를 1메가 바이트(MB)라 한다. 이때 1kB는 1,024byte 이지 않나?라는 생각이 들 수 있는데 이는 잘못된 관습이다 1024개씩 묶어 표현한 단위는 KiB, Mib와 같이 나타낸다.

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

 

이진법

본격적으로 0과 1만으로 숫자를 표현하는 방법을 알아보자

수학에서 0과 1만으로 모든 숫자를 표현하는 방법을 이진법이라고 한다.

일상적으로 십진법을 사용하는 데 9를 넘어갈 때 올림을 하는 것처럼 1을 넘어가는 시점에서 올림을 해주면 된다.

이진법으로 표현한 수를 이진수라 하는데 0과 1밖에 모르는 컴퓨터에 어떤 숫자를 알려 주려면 십진수가 아닌 이진수로 알려주어야 한다. 그런데 한 가지 문제가 있다. 숫자 10만 보고 이게 십진수인지 이진수인지 구분이 힘들어지는데 이를 예방하기 위에 이진수 끝에 아래 첨자(2)를 붙이거나 이진수 앞에 0b를 붙인다. 코드 상에서는 후자를 사용하여 이진수를 표기한다.

 

이진수의 음수 표현

십진수 음수를 표현할 땐 단순히 숫자 앞에 마이너스 부호를 붙이면 그만이다. 그런데 컴퓨터는 0과 1만 이해할 수 있기 때문에 마이너스 부호를 사용하지 않고 0과 1만으로 음수를 표현해야 한다.

이때 가장 널리 사용되는 방법은 2의 보수를 구해 이 값을 음수로 간주하는 방법이다. 2의 보수의 사전적 의미는 '어떤 수를 그보다 큰 2^n에서 뺀 값'을 의미한다. 예를 들어 11의 2의 보수는 1보드 큰 2^n 즉 1000에서 11을 뺀 01이 되는 것이다.

이를 쉽게 표현하면 '모든 0과 1을 뒤집고, 거기에 1을 더한 값'으로 이해하면 편하다. 11을 뒤집으면 00이 되고 이에 1을 더하면 01이다.

이때 2의 보수를 통해 나타내면 이진수만 보고 음수인지 양수인지 어떻게 구분하는 가에 대한 의문이 생긴다.

실제로 이만 봐서는 음수인지 양수인지 구분이 어렵다 그렇기에 컴퓨터 내부에서 어떤 수를 다룰 때는 '플래그'를 사용한다. 플래그는 어떤 값에 대한 부가 정보를 나타낸다. 이는 뒤에서 다루겠다.

하지만 2의 보수에도 한계가 있다. 바로 0이나 2^n 형태의 이진수에서는 원하는 음수 값을 얻을 수 없다는 단점이 있다.

 

십육진법

이진법은 0과 1만으로 모든 숫자를 표현하다 보니 숫자의 길이가 너무 길어진다는 단점이 있다.

그래서 데이터를 표현할 때 이진법 이외에 십육진법도 자주 사용한다. 십육진법은 수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식이다. 십진수 10, 11, 12, 13, 14, 15를 십육진법 체계에서는 각각 A, B, C, D, E, F로 표기한다. 십육진수는 이진수보다 한 글자로 더 많은 정보를 표현할 수 있다.

십육진수도 이진수와 마찬가지로 아래첨자(16)를 붙이거나 숫자 앞에 0x를 붙여 구분한다. 코드 상에서는 후자를 사용하여 십육진수를 표기한다.

 

십육진수를 이진수로 변환하기

십육진수는 한 글자당 열여섯 종류의 숫자를 표현할 수 있다. 그렇다면 이를 이진수로 표현하려면 몇 비트가 필요하겠는가? 바로 2^4 = 16이니 4비트이다.

십육진수 한 글자를 4비트의 이진수로 간주하고 이것들을 이어붙이면 십육진수가 이진수로 변환된다. 예를 들어 1A2B라는 십육진수에서 각 숫자를 이진수로 나타내면 0001 1010 0010 1011이다. 이 숫자를 이어붙인 값, 즉 0001101000101011(2)가 된다.

이와 반대로 이진수를 십육진수로 나타낼 때는 이진수 숫자를 4개씩 끊어서 십육진수 한자리로 만들어 이어 붙이면 끝이다.


0과 1로 문자를 표현하는 방법

 

문자 집합과 인코딩

0과 1로 문자를 표현하는 방법에 대해 알아보기 전 반드시 알아야 할 세 가지 용어가 있다.

바로 문자 집합, 인코딩, 디코딩이다.

컴퓨터가 인식하고 표현할 수 있는 문자의 모음을 문자집합이라 한다. 컴퓨터는 문자 집합에 속해 있는 문자만 이해할 수 있다.

문자 집합에 속한 문자라고 컴퓨터가 그대로 이해할 수 있는 건 아니다. 문자를 0과 1로 변환해줘야 비로소 이해할 수 있는 것이다. 이 변환 과정을 문자 인코딩이라 하고 인코딩 후 0과 1로 이루어진 결과값이 문자코드이다.

인코딩의 반대 과정, 즉 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정은 문자 디코딩이라한다.

 

아스키 코드

아스키는 초창기 문자 집합 중 하나로, 아스키 문자 집합에 속한 문자들은 각각 7비트로 표현되는데 이는 총 128개의 문자를 표현한다. 0부터 127까지 총 128개의 숫자 중 하나의 고유한 수에 일대일로 대응된다. 아스키 문자에 대응된 고유한 수를 아스키 코드라하고 이를 이진수로 표현함으로써 인코딩된다.

* 실제로는 하나의 아스키 문자를 나타내기 위해 8비트(1바이트)가 사용된다. 이때 1비트는 패리티 비트라 불리는 오류 검출 비트이기 때문에 실질적으로 7비트로 표현되는 것이다.

아래 사이트에서 아스키 코드 표를 참고할 수 있다.

https://www.ibm.com/docs/ko/aix/7.1.0?topic=adapters-ascii-decimal-hexadecimal-octal-binary-conversion-table

간단하게 인코딩할 수 있다는 장점도 있지만 단점도 있는데, 아스키 문자 외의 문자, 특수문자(한글 등)표현할 수 없다. 근본적으로 128개보다 많은 문자를 표현할 수 없기 떄문이다. 그렇기에 영어권 외의 나라들에서 자신들의 언어를 0과 1로 표현할 수 있는 고유한 문자 집합과 인코딩 방식이 필요하다 생각했고 이런 이유로 한글 인코딩방식 즉 EUC-KR이 등장했다.

 

EUC-KR

알파벳을 쭉 이어 쓰면 단어가되는 영어와 달리, 한글은 각 음절 하나하나가 초성, 중성, 종성의 조합이다.

그래서 한글 인코딩에는 두 가지 방식, 완성형과 조합형이 존재한다.

완성형 인코딩 방식은 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식이다.

조합형 인코딩 방식은 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식이다.

EUC-KR은 KS X 1001, KS X 1003이라는 문자 집합을 기반으로 하는 대표적인 완성형 인코딩방식이다.

즉 EUC-KR 인코딩 한글 단어에 2바이트 크기의 코드를 부여한다. 한글 자당 16비트가 필요한데 이는 네자리 십육진수로 나타낼 수 있다.

EUC-KR 인코딩 방식은 총 2,350개 정도의 한글 단어를 표현할 수 있다. 아스키 코드보다 표현 할 수 있는 문자가 많아졌지만 사실 쀍, 쀓, 믜와 같이 모든 한글 조합을 표현할 수 있는 것은 아니다. 이러한 문제는 여러 문제를 유발하는데, 웹사이트에서 한글이 깨지는 등의 문제가 발생할 수 있다.

 

유니코드와 UTF-8

언어별로 인코딩을 나라마다 해야 한다면 다국어를 지원하는 프로그램을 만들 때 각 나라 언어의 인코딩을 모두 알아야하는 번거로움이 있다. 그런데 만약 모든 나라 언어의 문자 집합과 인코딩 방식이 통일되어 있다면 언어별로 인코딩하는 수고로움을 덜 수 있다. 그래서 등장한 것이 유니코드 문자집합이다. 유니코드는 EUC-KR보다 훨씬 다양한 한글을 포함하며 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지 표현할 수 있다.

EUC-KR이나 아스키 코드는 글자에 부여된 값을 그대로 인코딩 값으로 삼는다. 유니코드는 조금 다르게 글자에 부여된 값 자체가 아닌 다양한 방법으로 인코딩하는데 크게 UTF-8, UTF-16, UTF-32등이 있다.

 

UTF-8에 대해 알아보자. UTF-8은 가변길이 인코딩 방식이다.

UTF-8은 통상 1바이트부터 4바이트까지의 인코딩 결과를 만든다. 즉 코딩한 결과 값이 다양하게 나온다는 것인데 이는 유니코드 문자에 부여된 값은 범위에 따라 결정된다.

아래의 표에 범위에 맞게 x표 있는 곳에 유니코드 문자에 부여된 고유 값들이 들어간다. 6바이트까지 나와있는데 통상적으로 인코딩 값을 맞추기위해 4바이트까지만 사용한다.