0과 1로만 어떻게 문자, 숫자를 표현할까?
정보 단위
--
컴퓨터는 0과 1로 모든 정보를 표현하고, 0과 1로 표현된 정보만을 이해할 수 있다.
정보 단위는
데이터를 표현하고 처리하는 데 사용되는 기본적인 크기를 의미한다.
- 비트 ( Bit )
- 바이트 ( Byte )
- 킬로바이트 (KiloByte, KB )
- 메가바이트 ( MegaByte, MB )
- 기가바이트 ( GigaByte, GB )
- 테라바이트 ( TeraByte, TB )
비트 (Bit)는
0과 1을 나타내는 가장 작은 정보 단위로 0 또는 1만 표현이 가능하다.
(비트는 전기 신호에서 0 = 꺼짐, 1 = 켜짐의 상태를 나타낸다.)
즉, 0 또는 1만 표현이 가능한 한 자릿수 단위라고 생각하면 된다.
1bit = 0, 1 총 2가지 정보 표현 가능
2bit = 00, 01, 10, 11 총 4가지 정보 표현 가능
3bit = 000, 001, 010, 011, 100, 101, 110, 111 총 8가지 정보 표현 가능
.
.
.
비트가 커질수록 표현할 수 있는 정보의 개수가 늘어나는데
n비트 = 2^n가지 정보를 표현하는 규칙을 알 수 있다.
- 1Byte = 8Bit
- 1KB = 1000Byte
- 1MB = 1000KB
- 1GB = 1000MB
- 1TB = 1000GB
1KB = 1024Byte처럼
여기서 단위를 1000이 아니라 1024로 표현하는 것은
KB, MB, GB, TB 단위가 KIB, MIB, GIB, TIB 단위다.
위 정보 단위들 뿐만 아니라
워드 (word)라는 단위도 존재한다.
워드(word)는
CPU가 한 번에 처리할 수 있는 데이터 크기를 의미하는 것으로
만약 CPU가 한 번에 16bit를 처리 가능하다면 1워드는 16비트가 되고
32bit 처리가 가능하다면 1워드는 32비트가 된다.
여기서 워드를 표현하는 여러 단위가 있다.
- 하프 워드 (half word) : 1워드 * 0.5 크기
- 풀 워드 (full word) : 1워드 * 1 크기
- 더블 워드 (double word) : 1워드 * 2 크기
--
이진법
--
이진법은
0과 1만으로 숫자를 표현하는 방법이다.
평소에 사용하는 십진법은
0부터 9까지의 숫자만으로 숫자를 표현하는 방법이다.
이때 십진법은 9를 넘어가는 시점에 자리 올림을 하는 방식처럼
이진법 또한 1을 넘어가는 시점에 자리 올림을 하는 방식이다.
이진법을 이용하여 표현한 숫자를 이진수,
십진법을 이용하여 표현한 숫자를 십진수라고 부른다.
10진수와 2진수 외에도
8진수, 16진수가 존재한다.
8진수 = 0 ~ 7만으로 숫자를 표현
16진수 = 0 ~ 15만으로 숫자를 표현
(10부터는 2자리 숫자이므로 대문자 영문을 이용하여 표현한다. 10 = A, 11 = B, 12 = C, 13 = D, 14 = E, 15 = F)
10진수가 아닌 다른 진수를 표현하게 되면 10진수와 구분을 할 수 없어서 10진수라고 생각할 수 있기 때문에
각 진수는 어떠한 진수인지 구분하기 위해 표현하는 방법이 존재한다.
2진수
- 숫자 끝에 (2)를 붙인다 : 1101(2)
- 숫자 앞에 0b를 붙인다 : 0b1101
8진수
- 숫자 앞에 0을 붙인다 : 0320
16진수
- 숫자 앞에 0x를 붙인다 : 0x3F32
2진수를 음수로 표현하기
10진수인 경우 음수를 표현할 때에는 그냥 숫자 앞에 "-"기호를 붙이면 된다.
다만 컴퓨터는 0과 1만 이해할 수 있기 때문에 부호를 사용하지 말고 0과 1로만 음수를 표현해야 한다.
이때 0과 1만으로 음수를 표현하는 일반적인 방법은
2의 보수를 구하고 해당 값을 음수로 간주하는 방법이다.
2의 보수는
사전적 의미로 "어떤 수를 그보다 큰 2^n에서 뺀 값"을 의미한다.
ex)
11(2)의 2의 보수 = 11(2) 보다 큰 100(2)에서 11(2)을 뺀 01(2)이 2의 보수가 된다.
사전적(공식적)으로 계산을 하는 방법은 위의 방법이지만
이를 꼼수(?)로 쉽게 2의 보수로 변환하는 방법은
0과 1을 모두 뒤집고 +1을 하면 2의 보수가 된다.
다만 2의 보수로 음수를 표현하는 것에도 한계가 존재한다.
- 0을 음수로 표현하기
- 2^n을 음수로 표현하기
0을 음수로 표현하는 경우
000(2)을 111로 뒤집고 +1을 하면 1000이 된다.
여기서 000은 3bit로 음수 또한 3bit로 표현되어야 한다.
다만 1000은 4bit으로 3bit으로 자르면 000이 되어 +1 한 값이 없어지게 된다.
(하지만 -0이라는 표현이 없기 때문에 크게 문제가 있을까 싶다.)
2^n을 음수로 표현하는 경우
1000(2)을 0111로 뒤집고 +1을 하면 1000이 된다.
이렇게 양수로 표현한 값과 음수로 표현한 값이 동일하게 된다.
즉, -2^n과 2^n이라는 수는 동시에 표현이 불가능하다.
2진수만 보고 음수인지 양수인지 어떻게 구분할까?
컴퓨터 내부에서는 어떠한 수를 다룰 때 해당 수가 양수인지 음수인지를 구분하기 위해
"플래그(flag)"를 사용한다.
플래스(flag)는
컴퓨터 내부에서 어떠한 값을 다룰 때 부가 정보가 필요한 경우 추가하는 부가 정보다.
--
각 진수끼리 변환하기
--
16진수 -> 2진수
16진수 -> 8진수
2진수 -> 8진수
처럼 각 진수끼리 변환을 하려면 각 진수가 표현하는 비트를 생각하면 된다.
16진수 = 한 단위에 0 ~ F까지 총 16개 표현 가능 = 2^4 = 4비트
8진수 = 한 단위에 0 ~ 7까지 총 8개 표현 가능 = 2^3 = 3비트
2진수 = 한 단위에 0 ~ 1까지 총 2개 표현 가능 = 2^1 = 1비트
2진수 <-> 16진수 변환
16진수는 한 자리수당 4비트이므로
16진수의 한 자리와 2진수의 4자리와 동일하게 표현하면 된다.
16진수와 8진수를 변환하기 위해서는
중간에 2진수로 먼저 변환 후 16진수 또는 8진수로 변환해야 한다.
16진수는 4비트, 8진수는 3비트 단위이므로 서로 변환하기 어렵기 때문이다.
--
문자 집합과 인코딩, 디코딩
--
0과 1로 문자를 표현하는 방법을 알아보기 전에
문자 집합, 인코딩, 디코딩에 대해 먼저 알아야 한다.
- 문자 집합 : 컴퓨터가 인식하고 표현할 수 있는 문자의 모음
- 문자 인코딩 : 문자를 0과 1로 변환 (컴퓨터가 이해할 수 있도록)
- 문자 디코딩 : 0과 1을 문자로 변환 (사람이 이해할 수 있도록)
아스키코드 (ASCII, American Standard Code for Information Interchange)
아스키코드는
초창기 문자 집합 중 하나로
영어 알파벳, 아라비아 숫자, 일부 특수 문자를 포함하고 있다.
아스키 문자 집합에 속한 각 문자(아스키 문자)는 7비트로 표현된다.
즉, 2^7개의 경우의 수를 가지고 있으므로 총 128개의 문자를 표현할 수 있다.
사실 하나의 아스키 문자를 나타내기 위해서는 8비트를 사용한다.
다만 8비트 중에서 1비트는 패리티 비트(parity bit)로 사용된다.
그래서 실직적으로 문자를 표현하기 위해 사용되는 비트는 7비트다.
패리티 비트 (Parity Bit)는
오류 검출을 위해 사용되는 비트다.
아스키코드 (ASCII)
아스키코드는 매우 간단하게 인코딩 된다는 장점이 있지만
이 외의 문자를 표현할 수 없다는 단점이 있다. (한글이 없다.)
즉, 7비트로 표현하는 총 128개보다 많은 문자를 표현하지 못하기 때문에
1비트를 더 추가한 8비트의 "확장 아스키"가 등장하기도 했지만 이것 또한 256개만 표현이 가능하므로 부족하다.
그래서 한국을 포함한 영어권 외의 나라들은
자신들의 언어를 0과 1로 표현할 수 있는 고유한 문자 집합과 인코딩 방식이 필요하다고 생각했고
한국에서는 한글 인코딩 방식인 "EUC-KR"을 만들었다.
하지만 "EUC-KR"또한 모든 한글을 표현할 수 없다는 한계가 있었고
언어별로 인코딩을 나라마다 해야 한다면 다른 나라의 언어를 인코딩할 때마다 해당 나라의 인코딩을 알아야 하는
번거로움이 존재했다.
이를 해결하기 위해 "유니코드(Unicode)" 문자 집합이 등장했다.
유니코드는 "EUC-KR"보다 훨씬 다양한 한글을 포함하며, 대부분의 나라의 문자, 특수문자, 이모티콘까지도
코드로 표현할 수 있는 통일된 문자 집합이다.
이때 유니코드를 인코딩하는 방법들이 여러 가지 있다.
- UTF-8
- UTF-16
- UFT-32
등이 존재한다.
[ UTF = Unicode Transformation Fomat = 유니코드를 인코딩하는 방법을 의미 ]
이 중에서 가장 대중적인 방법은 UTF-8이다.
--
'CS > 컴퓨터 구조' 카테고리의 다른 글
[CPU 동작 원리] 레지스터 종류 (0) | 2024.08.24 |
---|---|
[CPU 작동 원리] ALU와 제어장치 (0) | 2024.08.23 |
[명령어] 명령어의 구조 ( 연산 코드, 오퍼랜드, 주소 지정 방식 ) (0) | 2024.08.22 |
[명령어] 고급 언어와 저급 언어 ( 컴파일, 인터프리터 ) (0) | 2024.08.21 |
컴퓨터 구조 (+전체적인 구조 간단 설명) (2) | 2024.08.19 |