컴퓨터는 0, 1로 모든 정보를 표현한다. 컴퓨터가 숫자, 문자를 각각 어떻게 이진법으로 표현하는지 공부해 보자.
숫자의 표현
정보 단위
- 비트(bit)
- 0과 1을 표현할 수 있는 가장 작은 정보 단위.
n비트
는 2n 가지 정보를 표현할 수 있다.
- 1비트는 두 가지 정보를 표현할 수 있다: 0, 1
- 2비트는 네 가지 정보를 표현할 수 있다: (0, 0), (0, 1), (1, 0), (1, 1)
- 3비트는 여덟 가지 정보를 표현할 수 있다: (0, 0, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (0, 1, 1), (1, 0, 1), (1, 1, 0), (1, 1, 1)
- 바이트(byte)
- 비트보다 한 단계 큰 단위로서,
1 byte = 8 bit
n바이트
는 28n 가지 정보를 표현할 수 있다.
- 킬로바이트(kilobyte)
- 바이트보다 한 단계 큰 단위로서,
1 kilobyte = 1000 bit
- 메가바이트(megabyte)
- 킬로바이트보다 한 단계 큰 단위로서,
1 megabyte = 1000 kilobyte
- 기가바이트(gigabyte)
- 메가바이트보다 한 단계 큰 단위로서,
1 gigabyte = 1000 megabyte
- 테라바이트(terabyte)
- 기가바이트보다 한 단계 큰 단위로서,
1 terabyte = 1000 gigabyte
word: CPU가 한 번에 처리할 수 있는 데이터 크기.
- 1워드 = 16비트일 경우,
- 하프 워드(half word): 8비트
- 풀 워드(full word): 16비트
- 더블 워드(double word): 32비트
- 현대 컴퓨터의 대부분의 워드 크기는 32비트 또는 64비트이다.
출처: https://ko.wikipedia.org/wiki/%EC%9B%8C%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)
이진법
- 이진법(binary): 0, 1만으로 모든 숫자를 표현하는 방법
- 이진수: 이진법으로 표현한 수
- 하나의 이진수 =
1비트
- 십진법(decimal): 0 ~ 9 10개의 숫자로 모든 숫자를 표현하는 방법
- 십진수: 십진법으로 표현한 수
이진수의 표기
- 이진수 '8'의 수학적 표기: 1000(2)
- 이진수 '8'의 코드상 표기: 0b1000
이진수의 음수 표현
- 컴퓨터가 0, 1만 이해할 수 있으므로 '-'를 붙이는 것으로는 이진수의 음수를 표현할 수 없다.
- 2의 보수를 구해 이 값을 음수로 간주하여 음수를 표현하는 방법이 일반적이다.
- 보수(complement): 어떤 수를 그보다 큰 2n에서 뺀 값.
- 보수를 구하는 법
- (1) 11(2) 보수는, 11(2) 보다 큰 2n인 100(2) 에서 11(2)를 뺀 01(2)이 됨.
- (2) 이진수에서 모든 0과 1을 뒤집은 후 1을 더한다(더 쉬운 방법).
- 이진수의 양수와 음수를 구분하기 위해, 컴퓨터는 플래그(flag) 라는 부가정보를 사용한다.
십육진법
- 이진법으로 컴퓨터가 이해하는 모든 숫자를 표현할 수는 있지만, 너무 길어진다는 단점이 있다. 이를 보완하기 위해 십육진법(hexadecimal)이 사용된다.
- 십육진법은 수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식이다.
- 십진법의 10, 11, 12, 13, 14, 15 => 십육진법에서는 A, B, C, D, E, F
- 십육진법을 사용하는 주된 이유는 이진수와 십육진수의 상호 변환이 쉽기 때문이다.
- 하나의 십육진수 =
4비트
(24)
십육진수의 표기
- 십육진수 '15'의 수학적 표기: 15(16)
- 십육진수 '15'의 코드상 표기: 0x15
문자의 표현
0과 1로 어떻게 문자를 표현할 수 있을까?
문자 집합과 인코딩
- 문자 집합(character set): 컴퓨터가 인식하고 표현할 수 있는 문자의 모음. 이 외의 문자는 이해할 수 없다.
- 문자 인코딩(character encoding): 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정. 인코딩을 통해 비로소 컴퓨터가 문자를 이해할 수 있다.
- 문자 디코딩(character decoding): 인코딩의 반대 과정. 0, 1로 이루어진 문자 코드를 문자로 변환하는 과정. 디코딩을 통해 비로소 사람이 문자 코드를 읽을 수 있다.
다양한 문자 집합과 인코딩 방법
- 영어 알파벳, 아라비아 숫자, 일부 특수 문자를 표현
- 아스키 문자 집합에 속한 문자는 7비트로 표현되어, 총 27개의 문자를 표현할 수 있다.
- Backspace, Escape, Cancel, Space, Del과 같은 제어 문자도 포함되어 있다.
- 문자 하나당 크기:
1바이트(=8비트)
- 단, 한글을 표현할 수 없고, 비트수의 한계로 표현 가능한 문자 수가 많이 부족하다.
- 8비트의 확장 아스키(Extended ASCII)가 등장했으나, 이 역시 256개의 문자만 표현할 수 있다.
EUC-KR
- 한글을 위해 개발된 인코딩 방식.
- 완성형 인코딩: 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식.
- 조합형 인코딩: 초성, 중성, 종성 각각에 비트열을 할당하고 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식.
- 문자 하나당 크기: 초성, 중성, 종성이 모두 결합된 한글 단어가
2바이트(=16비트)
이다.
- 따라서 EUC-KR로 인코딩된 한글은 네 자리 십육진수로 표현 가능.
- 하지만 모든 한글을 표현할 수 없음(ex. '쀍', '믜' 등)
- MS의 CP949(Code Page 949) 라는 EUC-KR의 확장 버전의 인코딩 방식을 개발했으나, 한글 전체를 표현하기에는 역시 부족함.
유니코드와 UTF-8
- 유니코드(Unicode): 여러 나라의 언어를 광범위하게 언어를 아우르는 문자 집합과 통일된 표준 인코딩 방식으로서, 언어별로 인코딩하는 비용을 덜어줌.
- 한글 뿐만 아니라 문자, 특수문자, 화살표, 이모티콘 등도 표현할 수 있다.
- 유니코드는 글자에 부여된 값을 그대로 사용하는 것이 아니라,
UTF-8
, UTF-16
, UTF-32
등의 방식으로 인코딩한 값을 사용한다.
- UTF: Unicode Transformation Format
- 가장 대중적인 방식은 UTF-8로서 통상 1바이트 ~ 4바이트의 인코딩 결과를 만들어 내는데, 이 크기는 유니코드 문자에 부여된 값의 범위에 따라 결정된다.
- UTF-8 인코딩 과정
- EUC-KR처럼, 각 문자마다 십육진수의 고유한 값이 부여된다.
- 각 문자마다 부여된 십육진수를 이진수로 변환한다.
- 변환된 모든 이진수를 나열한 것이 인코딩 결과물이 된다.
* 이 글은 '혼자 공부하는 컴퓨터 구조+운영체제(한빛미디어, 2022)'를 개인적인 학습을 목적으로 요약한 게시글입니다. 문제가 있는 경우, 지적해 주시면 감사하겠습니다.