Priv's Blog
2. 데이터 본문
1. 0과 1로 숫자를 표현하는 방법
컴퓨터는 0과 1로만 이루어진 데이터만 이해할 수 있다.
그렇다면 어떻게 컴퓨터는 3 + 10을 계산할 수 있을까?
1.1) 정보 단위
컴퓨터가 이해하는 가장 작은 정보의 단위를 비트(bit)라고 부른다.
유효한 값이 있으면 1, 유효한 값이 없으면 0이라고 생각하면 된다.
즉, 전구처럼 불이 꺼진 것과 켜진 것만 표현할 수 있으며, 이 표현의 최소 단위가 비트이다.
이때 2비트는 총 4가지의 상태를 표현할 수 있다.
즉, n개의 비트로 표현할 수 있는 상태 값은 2^n가지이다.
바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트 등 다양한 정보 단위가 더 존재하며, 바이트를 제외한 나머지 단위들은 이전 단위를 1000개씩 묶어서 표현한 단위들이다.
워드(word)라는 단위도 존재한다.
이 단위는 CPU가 한 번에 처리할 수 있는 데이터의 크기를 말한다.
CPU가 16비트의 데이터를 한 번에 처리할 수 있다면 1워드는 16비트가 된다.
여기서 하프 워드, 풀 워드, 더블 워드라는 단위도 존재한다.
1.2) 이진법
수학에서 0과 1만 사용하여 숫자를 표현하는 방법을 이진법(binary)이라고 부른다.
우리는 일상적으로 십진법(decimal)을 사용한다.
이진수는 다음과 같이 십진수로 변환될 수 있다.
이진수와 십진수를 구분하기 위해서 이진수 끝에는 아래첨자 (2)를 붙이거나, 이진수 앞에 0b를 붙여야 한다.
그렇지 않으면 이진수 10과 십진수 10을 구별할 수 없을 것이다.
1.3) 이진수의 음수 표현
십진수에서 음수를 표현할 때는 -34처럼 마이너스 부호를 붙이면 끝이다.
하지만 이진수는 그렇지 않다.
0과 1로만 이루어진 이진수에서는 '2의 보수'와 같은 방식으로 음수를 표현한다.
2의 보수를 쉽게 표현하자면 '모든 0과 1을 뒤집고, 거기에 1을 더한 값'을 말한다.
0b11의 2의 보수는 0b01이다.
마찬가지로 0b1011의 2의 보수는 0b0101이 된다.
이러한 방식으로 음수를 표현하면 문제점이 하나 생긴다.
음수로서의 0b0101과 양수로서의 0b0101을 구분할 방법이 없다.
컴퓨터 상에서는 이 문제를 해결하기 위해 '플래그(flag)'를 사용한다.
2의 보수 방법은 널리 쓰이는 방법이긴 하지만 완벽한 방법은 아니다.
예를 들어 0b1000을 음수로 표현한다고 가정하면 0b1000이 되어 자신과 같은 수가 되어 버린다.
이 문제는 본질적으로 해결이 불가능하다.
즉, n비트로는 -2^n과 2^n이라는 수를 동시에 표현할 수 없다.
1.4) 십육진법
십육진법은 수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식이다.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, ~ 순서로 진행된다.
십육진수는 아래첨자 (16)을 붙이거나, 0x를 숫자 앞에 붙여서 구분한다.
십육진법을 사용하면 이진수를 십육진수로, 십육진수를 이진수로 변환하기가 쉬워진다.
1.5) 십육진수를 이진수로 변환
십육진수 한 글자를 4비트의 이진수로 간주하여 변환하면 된다.
0x1A2B라는 십육진수가 있다고 가정하면, 1, A, 2, B를 각각 나눠서 이진수로 변환하면 된다.
그러면 0b0001101000101011이 된다.
1.6) 이진수를 십육진수로 변환
이 경우는 반대로 계산하면 된다.
이진수 네 글자를 한 묶음으로 끊어서 변환, 이어 붙이면 된다.
0b0001101000101011를 0001 1010 0010 1011로 나눈 뒤, 각 자리를 십육진수로 변환한다.
그러면 0x1A2B가 된다.
2. 0과 1로 문자를 표현하는 방법
여태까지 숫자를 표현했다면 이번에는 문자를 표현해 볼 차례이다.
2.1) 문자 집합, 인코딩, 디코딩
- 문자 집합: 컴퓨터가 인식하고 표현할 수 있는 문자의 집합
- 문자 인코딩: 문자 집합에 속한 문자들을 컴퓨터가 이해할 수 있도록 0과 1로 이루어진 데이터로 변환하는 과정
- 문자 디코딩: 문자 인코딩을 통해 0과 1로 변환된 데이터를 사람이 이해할 수 있는 문자로 변환하는 과정
이 3가지 개념은 문자를 표현하는 방법을 이해하는 데 필수적인 개념들이다.
2.2) 아스키 코드 (ASCII Code)
아스키 코드는 영어 알파벳, 아라비아 숫자, 일부 특수 문자를 표현할 수 있는 문자 집합이다.
아스키 코드는 각 문자들을 7비트로 표현하므로, 총 128개의 문자를 표현할 수 있다.
사실 하나의 아스키 문자를 표현하기 위해서는 8비트가 사용되는데, 1비트는 패리티 비트(parity bit)라고 하여 오류 검출을 위해서 사용되는 별도의 비트이다.
즉, 실질적으로 문자 표현에 사용되는 비트는 7비트라고 보면 된다.
아스키 코드는 순전히 '영어'만 지원한다.
즉, 다른 나라 문자는 아스키 코드가 아니라 '유니코드(Unicode)'를 사용하여 표현된다.
2.3) EUC-KR
EUC-KR은 한글을 인코딩하기 위해 사용된다.
한글은 영어와 달리 모아쓰기의 개념이 적용되는 언어이다.
즉, 초성, 중성, 종성이 조합되는 방식이다.
- 완성형 인코딩: 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 방식이다.
- 조합형 인코딩: 초성, 중성, 종성을 위한 비트열을 따로 할당하여 조합한 뒤, 하나의 글자 코드를 완성하는 방식이다.
여기서 EUC-KR은 완성형 인코딩 방식을 사용한다.
한글 한 글자에는 2바이트가 요구된다.
즉, EUC-KR로 한글을 표현하기 위해서는 16비트가 요구된다.
사실 EUC-KR을 사용해도 일상적으로 사용되는 문자들은 대부분 커버가 가능하다.
하지만 '쀍', '믜'와 같이 문자 집합에 누락된 문자들은 표현이 불가능하다.
2.4) 유니코드(Unicode)와 UTF-8
모든 나라 언어의 문자 집합과 인코딩 방식을 통일해 둔다면 언어별로 인코딩을 해야 하는 번거로움을 줄일 수 있을 것이다.
이러한 배경에서 탄생한 것이 유니코드(Unicode)이다.
유니코드는 글자에 부여된 값 자체를 인코딩 된 값으로 삼지 않는다.
이 값을 다양한 방법으로 인코딩을 하는데, 인코딩 방법에 따라 UTF-16, UTF-8처럼 뒤에 붙는 번호가 달라진다.
일반적으로 UTF-8을 기본으로 사용한다.
수고하셨습니다!
'Dev. Study Note > Computer Architecture' 카테고리의 다른 글
6. 보조기억장치 (0) | 2023.03.28 |
---|---|
5. RAM (0) | 2023.03.26 |
4. CPU (0) | 2023.03.19 |
3. 명령어 (0) | 2023.03.12 |
1. 컴퓨터 구조 (0) | 2023.03.11 |