Study/컴퓨터 구조 | 운영체제

[컴퓨터 구조] | 데이터를 0과 1로 표현하기

jaeyeong 2023. 6. 19. 10:58

 

컴퓨터는 0과 1로 모든 정보를 표현하며, 0과 1로 표현된 정보만 이해할 수 있다.

나는 컴퓨터를 사용하면서 한 번도 0과 1로만 사용해 본 적이 없다.

하지만 컴퓨터는 0과 1로 된 정보만 이해할 수 있다고 한다.

 

그러면 컴퓨터는 내가 0과 1을 제외하여 표현한 정보들을 어떻게 이해할 수 있는 걸까?


정보 단위

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

 

1비트는 (0), (1)로 두 가지 정보를 표현할 수 있다. 그러면 2비트는 몇 가지 정보를 표현할 수 있을까?

(0, 0) (0, 1), (1, 0), (1, 1)로 네 가지 정보를 표현할 수 있다.

이렇게 n비트는 2의 n승 개의 정보를 표현할 수 있다.

 

프로그램의 크기가 커질수록 비트의 크기는 커지는데,

큰 크기를 표현하기 어려우니 편의를 위해 비트보다 큰 단위가 존재한다.

큰 단위로는 바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트 등이 있다.

 

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

 

CPU가 한 번에 처리할 수 있는 데이터 크기를 나타내는 정보 단위를 워드라고 한다.

만약 CPU가 한 번에 16비트를 처리할 수 있다면 1워드는 16비트, 32비트를 처리할 수 있다면 1워드는 32비트가 된다.

워드 크기가 클수록 CPU가 한 번에 처리할 수 있는 데이터가 많아진다.

 

숫자를 표현하는 방법

숫자를 표현하는 방법에는 이진법, 십진법, 십육진법으로 크게 세 가지가 있다.

 

우리는 보통 십진법을 주로 사용한다. 숫자가 9를 넘어갈 때 올림하여 10, 20, 30... 이 되며

0부터 9까지 열 개의 숫자로 모든 수를 표현하기 때문에 십진법이라고 한다.

 

이진법숫자가 1을 넘어갈 때 올림하여 0과 1, 두 개의 숫자로 모든 수를 표현하기 때문에 이진법이라고 한다.

양수/음수를 구분하기 위해 플래그를 사용하기 때문에 컴퓨터 내부에서 부호가 헷갈릴 일은 없다.

 

아래는 1부터 10까지 이진법으로 표현한 내용이다.

더보기

1을 이진법으로 표현하기: 1

2를 이진법으로 표현하기: 10

3을 이진법으로 표현하기: 11

4를 이진법으로 표현하기: 100

5를 이진법으로 표현하기: 101

6을 이진법으로 표현하기: 110

7을 이진법으로 표현하기: 111

8을 이진법으로 표현하기: 1000

9를 이진법으로 표현하기: 1001

10을 이진법으로 표현하기: 1010

 

이진법만으로 모든 숫자를 표현할 수 있지만, 수가 커질수록 숫자의 길이가 길어진다.

이를 간단히 표현하기 위해 십육진법을 사용할 수 있다.

 

십육진법15를 넘어가는 때에 올림 하며 10, 11, 12, 13, 14, 15를 A, B, C, D, E, F로 표기한다.

즉, 0~9, A~F로 16가지의 값으로 정보를 표현한다.

 

나는 자릿수가 많아진 이진법을 더 적은 자릿수로 표현하기 위해 십육진법을 사용하는 이유가 와닿지 않았다.

십진수를 이용하면 우리가 보기 편하지 않을까 라는 생각이 들어서이다.

그리고 바로 이유를 알려주었는데, 바로 이진수를 십육진수로, 십육진수를 이진수로 변환하기 쉽기 때문이었다.

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

십육진수는 한 글자당 16종류의 숫자를 표현할 수 있다. 그러면 숫자 하나를 이진수로 표현하려면 2의 4승이 16이므로 4비트가 필요하다.

그래서 십육진수 한 글자를 4비트의 이진수로 변환하여 이어 붙이면 십육진수가 이진수로 변환되는 것이다.

 

// 십육진수인 1A2B를 이진수로 변환하기

// 1. 십육진수 한 글자 한 글자를 각각 이진수로 변환한다.
1(16): 0001(2)
A(16): A는 십진수로 10 -> 1010(2)
2(16): 0010(2)
B(16): B는 십진수로 11 -> 1011

// 2. 변환된 이진수들을 모두 이어 붙인다.
0001101000101011(2)

 

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

위와 같은 이유로 이진수 숫자를 네 개씩 끊고, 16진수로 변환한 뒤 이어 붙인다.

 

// 이진수인 11010101을 십육진수로 변환하기

// 1. 이진수 숫자를 네개씩 끊어 십육진수로 변환한다.
1101(2): D(16)
0101(2): 5(16)

// 2. 변환된 십육진수들을 모두 이어 붙인다.
D5(16)

문자를 표현하는 방법

 

  1. 문자 집합: 컴퓨터가 인식하고 표현할 수 있는 문자의 모음
  2. 문자 인코딩: 문자 집합에 속한 문자를 0과 1로 변환하는 과정
  3. 문자 디코딩: 0과 1로 이루어진 문자를 사람이 이해할 수 있는 문자로 변환하는 과정 (<-> 문자 인코딩)

위 개념들을 기억해 두고 문자를 표현하는 방법을 알아보자!

 

아스키코드

아스키 문자들은 0부터 127까지 총 128개의 숫자들이 각각 고유한 수에 일대일로 대응된다.

이때 일대일로 대응된 고유한 수를 아스키코드라고 한다.

 

아스키 문자 집합에는 백 스페이스, 스페이스 등을 비롯한 제어 문자와 알파벳이 포함되어 있어 영어를 표현할 수 있지만,

한글은 표현할 수 없다.

 

EUC-KR

그래서 나온 인코딩 방식이 EUC-KR이다.

 

만약 '타입'이라는 글자가 있을 때 ㅌ + ㅏ ㅇ + ㅣ + ㅂ처럼 초성, 중성, 종성을 나누어 여기에 해당하는 코드를 합하여

하나의 글자 코드를 만드는 방식(조합형 인코딩 방식)이 아니라,

처럼 초성, 중성, 종성의 조합으로 완성된 하나의 글자에 해당하는 고유한 코드를 부여하는 방식(완성형 인코딩)으로 인코딩 된다.

 

한 글자에 2바이트 코드가 부여되며, 한 글자를 표현하기 위해선 16비트가 필요하다.

EUC-KR 방식으로 2,350개의 한글 단어를 표현할 수 있는데, 모든 글자가 포함되어 있는 것이 아니다 보니

'뷁'과 같이 문자 집합에 정의되지 않은 글자는 EUC-KR로 표현할 수 없다.

 

유니코드와  UTF-8

EUC-KR 인코딩 방식으로 한국어를 코드로 표현할 수 있게 되었지만, 앞서 말한 바와 같이 모든 한글을 표현할 수 없으며,

만약 다국어를 지원하는 프로그램을 만들 경우 지원할 모든 나라의 인코딩을 알아야 하는 번거로움이 있다.

 

이러한 번거로움을 잡기 위해 모든 나라 언어의 문자 집합과 인코딩 방식이 통일된 표준 인코딩 방식을 지원해야 했고,

유니코드라는 문자 집합이 등장했다.

유니코드대부분의 나라의 문자, 특수문자, 이모티콘 등을 코드로 표현할 수 있는 통일된 문자 집합이다.

 

그리고 이 유니코드를 다양한 방법으로 인코딩할 수 있는데, Unicode Transformation Format의 약어로 UTF라고 부른다.

인코딩 방법으론 UTF-8, UTF-16, UTF-32 등이 있으며 주로 UTF-8을 사용한다.

 

이로서 여러 나라의 문자들을 광범위하게 표현할 수 있게 되었다.


혼자 공부하는 컴퓨터 구조 + 운영체제 책을 읽고 정리하였습니다.