본문 바로가기

CS 공부/[강의] 혼공 컴퓨터구조 + 운영체제

[8/11] 0과 1로 숫자와 문자 표현하기

운영체제 강의

 


 

컴퓨터의 4가지 핵심부품

이 핵심부품들은 서로 정보를 주고받기 위해 메인보드(마더보드) 안에 부착된다.

 

메모리

프로세스의 명령어와 데이터를 저장하는 부품으로, 어떤 프로그램이 실행되기 위해선 메모리에 저장돼 있어야 한다. (설치는 했으나 현재 실행중이지 않은 프로그램은 보조 기억 장치에 저장돼 있다. 메모리의 주소를 통해 내가 원하는 데이터와 명령어가 어디에 있는지 알 수 있다. 

 

CPU

컴퓨터의 두뇌와 같다. 메모리에 저장된 명령어를 읽어들이고, 해석하고, 실행한다. ALU, 레지스터, 제어장치로 이뤄져있다.

 

보조기억장치

메모리는 전원공금이 안되면 저장내용을 읽는 휘발성장치이기에 메모리는 실행할 프로그램을 저장하고, 보조기억장치는 보관할 프로그램을 저장한다.

 

입출력장치

컴퓨터로 연결된 입출력 장치들은 버스(시스템버스)를 타고와서 메인보드로 연결돼 CPU와 메모리와 상호작용한다.

 

* 보조기억장치와 입출력장치는 딱잘라 구분되는 개념은 아니다. 통틀어 주변장치라고도 한다. 보조기억장치의 특징이라면, 보조기억장치는 메모리를 보조하는 조금 특별한 입출력 장치라는 것이다.

 

 


 

컴퓨터가 이해하는 정보단위

비트 bit : 0과 1을 표현할 수 있는 가장 작은 정보단위이다.

n비트로는 2^n가지의 정보표현이 가능하다. 프로그램은 수많은 비트(0과 1)로 이뤄져있다. 다만 평소에 이파일은 8,920,120비트야, 라고 표현하지않고 비트보다 더 큰 단위를 사용한다. 바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트 등
(예)  1비트는 2가지 정보를 표현할 수 있다.(01), 2비트는 4가지 정보를 표현할 수 있다.(00,01,10,11)

 

1byte = 8bit

1KB = 1000byte

1MB = 1000KB

1GB = 1000MB

1TB = 1000GB

 

이전단위를 1000개씩 묶으면된다. 과거에는 데이터들의 용량이 그리 크지 않았기때문에 1024개씩 묶는 경우도 많았으나, 요즘은 데이터 용량이 커졌기에 정확하게 하는 편이다. 그리고 엄연히 1024개씩 묶은 단위는 KiB, MiB, GiB(키비바이트, 메비바이트, 기비바이트) 라고 한다.

 

 

워드 word : CPU가 한번에 처리할 수 있는 정보의 크기단위

예를들어 CPU가 한번에 32비트씩 처리할 수 있다면 , 여기서 1워드는 32비트가 된다. half word(워드의 절반크기), full word(워드크기), double word(워드의 두배크기) 와 같은 워드들이 있다.

 

 

 


 

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

컴퓨터가 이해하는 정보 2가지는 데이터와 명령어이다. 그중 숫자데이터와 문자데이터를 컴퓨터가 이해할 수 있는 0과 1로 표현하는 방법을 알아보자. 

 

 

이진법 binary

숫자가 1을 넘어가는 시점에 자리올림을 한다. 우리가 일상적으로 사용하는 진법은 숫자가 9를 넘어갈때 자리올림하는 십진법(decimal) 이다. 이때 이진수 8표기, 라고 해서 십진수 1000과 이진수 1000 같은 경우에 이것이 십진수인지, 이진수인지 구분이 안간다. 그래서 이를 구분하기 위한 표기법으로 1000(2) 또는 0b1000이라고 쓴다.

 

십진법 이진법
1 1
2 10 (자리 올림)
3 11
4 100 (자리올림)
5 101
6 110 (자리올림)
7 111
8 1000(자리올림)

 

 

 

 

 

0과 1로 음수 표현하기 : 2의 보수법

컴퓨터는 마이너스 부호를 인식하지 못해서 0과 1만으로 음수를 표현해야 한다. 그래서 2의 보수법을 이용해서 구한 2의 보수로 음수를 표현하는데, 2의 보수는 어떤 수를 그보다 큰 2^n 에서 뺀값을 의미한다. 쉽게 구하는 방법은 모든 0과 1을 뒤집고 1을 더하면 된다.

 

//2의 보수법
11(2) 보다 큰 2^n = 100(2) 
100(2) - 11(2) = 01(2)

//쉽게 구하기
11(2) -> 00(2) -> 01(2)

 

 

flag 플래그

십진수 5를 이진수로 표현한 0101(2) 와 이진수 -1011(2)를 표현한 0101(2)는 똑같이 생겼다. 이를 구분하기 위해 CPU 내부에 플래그라는 특별한 레지스터가 있는데, CPU 내부에서 플래그 레지스터에 양수인지 음수인지를 표기하기에, 구분이 가능하다. (모든 숫자가 플래그 값을 표식으로 가지고 다닌다고 생각하면 된다.)

 

 

 

 

십육진법

이진법으로는 사람이 읽기엔 숫자의 길이가 너무 길어짐(십진수 32 == 이진수 10000) 그래서 컴퓨터데이터 표현시에 십육진법도 많이 사용되는데, 16진법은 숫자가 15를 넘어가는 시점에 자리올림을 하는 방식이다. 16진수 또한 이진수와 같이 구분하기 위해 수학적으로는 15(16), 코드상으로는 0x15 와 같이 표기한다. 그런데, 왜 십진수, 이진수가 있는데 굳이 십육진법까지 있는걸까. 그건 이진수와 십육진수간의 변환이 십진수와 이진수간의 변환보다 압도적으로 쉽기 때문이다. 16진수는 2^4 이기에 4비트로 표현한다. 즉 1A2B(16) 와 같은 십육진수는 1에 해당하는 이진수 4개와 같이 각 자리에 해당하는 수를 이진수 4개씩으로 변환한뒤 합치면된다. 그 반대로 이진수에서 십육진수 또한 마찬가지이다. 이진수에서 4개씩 끊어서 십육진수에 해당하는 수 하나로 바꾸고 합치면된다.

 

 

십진수 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
십육진수 0 1 2 3 4 5 6 7 8 9 A B C D E F 10자리올림 11

 

 

 

 


 

 

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

컴퓨터가 이해하는 정보 2가지는 데이터와 명령어이다. 컴퓨터는 0과 1밖에 이해하지 못하는데 어떻게 문자를 이해하고 표현할 수 있는지 알아보자. 들어가기 전 3가지 용어에 대한 이해가 필요하다.

 

 

문자집합과 인코딩

문자집합 Character Set

컴퓨터가 이해할 수 있는 문자의 모음을 의미한다. 즉, 컴퓨터는 문자집합에 속한 문자만 이해할 수 있다.

 

인코딩 encoding

큰 의미로 어떤 값을 코드로 표현하는 코드화 과정을 의미한다. 문자표현에 극한해서는 문자를 0과 1로 이뤄진 문자코드로 변환하는 과정을 말한다.

 

디코딩 decoding

인코딩의 반대인 코드를 해석하는 과정으로, 인코딩된(0과 1로 표현된) 문자코드를 문자로 변환하는 과정을 말한다.

 

 

 

아스키코드

가장 대중적인 인코딩 방법으로 초창기 문자 집합중 하나다. 알파벳,아라비아숫자, 일부특수문자 및 제어문자를 표현할 수 있다. 하나의 아스키 문자는 7비트로 이뤄져 있는데, 여기에 오류검출을 위해 사용되는 패리티비트(특별히 남겨놓은 특수비트) 1비트를 더해 실제로는 8비트가 쓰인다. 여기서 알 수 있는 것은 아스키 코드가 표현할 수 있는 총 문자개수는 2^7 = 128개 정도의 문자표현이 가능하다. 예를 들어 A는 65로 인코딩되는데, 이것을 이진수로 표현하면 컴퓨터가 이해하는 문자 A가 된다. 이렇게 문자하나에 부여된 값을 code point 코드포인트 라고 한다.

 

장단점

문자에 부여된 값을 그대로 인코딩 값으로 사용하면 되기에 인코딩이 간단하다는 장점이 있다. 하지만 한글을 포함한 다른 언어, 다양한 특수문자 표현이 불가하다. 아스키코드는 7비트로 하나의 문자를 표현하기에 128개보다 많은 문자를 표현할 수 없다. 8비트 확장아스키(extended ASCII) 가 등장했으나 여전히 부족하다. 그래서 이를 보완하기 위해 언어별 인코딩 방식이 도입됐다.

 

 

 

한글인코딩  :  완성형  vs  조합형

영어는 알파벳을 이어쓰면 단어가 되지만, 한글은 모음과 자음으로 초,중,종성의 조합으로 이뤄졌다. 그래서 글자하나에 고유한 코드를 부여하는 완성형 인코딩방식과 자음,모음 하나에 코드를 부여하는 조합형 인코딩 방식이 있다.

 

 

한글인코딩 방식  :  EUC - KR

KS X 1001 KS X 1003 문자집합 기반의 한글 인코딩 방식이다. 이는 완성형 인코딩 방식으로 글자 하나하나에 2바이트 크기의 코드를 부여한다. 2바이트는 16비트, 즉 4자리의 십육진수로 표현된다. 즉, 한자의 한글을 표현하기 위해선 십육진수 4자리가 필요하다. 이 방식으로 2350 개 정도의 한글표현이 가능하지만, 여전히 모든한글을 표현하기엔 부족하다. 쀏,뙠,휔 과 같은 한글은 표현이 불가하다. 또 국가마다 언어별인코딩을 사용하면 다국어를 지원하는 프로그램 개발시, 언어별 인코딩 방식을 모두 이해해야하므로 매우 번거롭다. 그래서 모든 언어,특수문자까지 통일된 문자집합을 사용하자, 라고 해서 나온 통일된 문자집합과 인코딩방식이 바로 '유니코드 문자집합' 과 utf - 8 인코딩 이다.

 

 

통일된 문자집합과 인코딩방식  :  유니코드 & utf - 8

유니코드는 통일된 문자집합으로 한글,영어,화살표 등의 특수문자, 이모티콘까지 표현이 가능하고 현재 문자 표현에 있어 매우 중요한 위치에 있다. 이런 유니코드의 인코딩 방식의 종류에는 utf - 8, utf - 16, utf - 32 등이 있다.

 

유니코드의 코드포인트  →  U+십육진수

 

유니코드값을 그대로 사용하는 것이 아니라,  이 유니코드 코드포인트를 위에서 설명한 다양한 인코딩 방식을 사용해 컴퓨터가 이해하는 0과1로 변환한다. 가장 대중적인 방식은 utf - 8 인코딩이다. utf - 8은 가변길이 잉ㄴ코딩으로 유니코드 범위에 따라 인코딩한 결과가 1바이트 ~ 4바이트가 될 수 있다. 예를들어 첫 코드포인트가 0800 이고 마지막 코드포인트가 FFFF라면 이 범위는 3바이트로 인코딩 된다.

 

 

 

 

인코딩에 대해 배웠으니, 글자가 깨지는 경우가 있다면...

인코딩이 호환되지 않는 건 아닌지, 문자집합에 포함되지 않은 문자가 사용된 것은 아닌지 생각해 볼 수 있다.