1. 0과 1로 숫자를 표현하는 방법
비트와 바이트
컴퓨터는 0과 1로 모든 정보를 표현하고, 0과 1로 표현된 정보만을 이해할 수 있다.
컴퓨터가 이해하는 가장 작은 정보 단위를 비트(bit)라고 하며 1 비트는 0 또는 1, 두 가지 정보를 표현할 수 있다.
즉 n 비트는 \(2^{n}\) 가지 정보를 표현할 수 있다.
우리가 실행하는 프로그램은 수십만 비트, 수백만 비트로 이루어져 있다. 따라서 표현의 편의를 위해 비트보다 큰 단위를 사용한다.
1 바이트(1byte) | 8 비트 (8 bit) |
1 킬로바이트(1kB) | 1,000 바이트 (1,000 byte) |
1 메가바이트(1MB) | 1,000 킬로바이트 (1,000 kB) |
1 기가바이트 (1GB) | 1,000 메가바이트 (1,000 MB) |
1 테라바이트 (1TB) | 1,000 기가바이트 (1,000 GB) |
바이트를 제외한 kB, MB, GB, 그 이상의 단위들은 모두 이전 단위를 1,000 개 묶어 표현한 단위라고 기억하면 된다.
비트 외에도 워드(word)라는 정보 단위가 있으며 CPU가 한 번에 처리할 수 있는 데이터 크기를 의미한다.
만약 CPU가 한 번에 16비트를 처리할 수 있으면 1 워드는 16 비트가 되며, 한 번에 32 비트를 처리할 수 있다면 1 워드는 32 비트가 된다.
- 하프 워드(half word) : 워드의 절반 크기.
- 풀 워드(full word) : 워드의 1배 크기.
- 더블 워드(double word) : 워드의 2배 크기.
이진법
0과 1만으로 모든 숫자를 표현하는 방법을 이진법(binary)이라 하며 이진법으로 표현한 수를 이진수라고 한다. 0과 1만 이해하는 컴퓨터에 어떤 숫자를 알려주기 위해서는 우리가 일상적으로 사용하는 십진수가 아닌 이진수로 알려주어야 한다. 숫자 10만 보면 십진수인지 이진수인지 구분할 수 없기 때문에 이진수로 표현할 때는 아래첨자 \(_{(2)}\)를 붙이거나 이진수 앞에 0b를 붙인다.
컴퓨터는 0과 1만 이해할 수 있기 때문에 마이너스 부호를 사용하지 않고 0과 1만으로 음수를 표현해야 한다.
→ 2의 보수를 음수로 이용한다.
2의 보수 : 어떤 수를 그보다 큰 \(2^{n}\)에서 뺀 값.
2의 보수를 쉽게 표현하면 '모든 0과 1을 뒤집고, 거기에 1을 더한 값'으로 이해하면 된다.
\(11_{(2)}\)의 2의 보수는 \(11_{(2)}\)의 모든 0과 1을 뒤집은 \(00_{(2)}\)에서 1을 더한 값인 \(01_{(2)}\)임을 알 수 있다.
하지만 실제로 이진수만 봐서는 음수인지 양수인지 구분할 수 없기 때문에 컴퓨터 내부에서 양수인지 음수인지 구분하기 위해 플래그(flag)를 사용한다. 플래그는 컴퓨터 내부에서 어떤 값을 다룰 때 부가 정보가 필요한 경우 사용된다.
십육진법
이진법은 0과 1만으로 모든 숫자를 표현하기 때문에 숫자의 길이가 길어진다는 단점이 있다. 따라서 데이터를 표현할 때 이진법 이외에 십육진법도 사용한다. 십육진수은 한 글자로 열여섯 종류(0~9, A~F)의 정보를 표현할 수 있으며 이진수와 마찬가지로 숫자 뒤에 아랫첨자 \(_{(16)}\)를 붙이거나 숫자 앞에 0x를 붙여 구분한다.
데이터를 표현할 때 이진법과 더불어 십육진법을 쓰는 이유는 이진수와 십육진수 간의 변환이 쉽기 때문이다.
- 십육진수를 이진수로 변환하는 방법 : 십육진수 한 글자를 4비트의 이진수로 간주한다.
- 십육진수 \(1A2B_{16}\)를 이진수로 바꿔보자.
- \(1_{(16)}\) → \(0001_{(2)}\)
- \(A_{(16)}\) → \(1010_{(2)}\)
- \(2_{(16)}\) → \(0010_{(2)}\)
- \(B_{(16)}\) → \(1011_{(2)}\)
- 이를 종합하여 표현하면, \(1A2B_{(16)}\) → \(0001 1010 0010 1011_{(2)}\)
- 이진수를 십육진수로 변환하는 방법 : 이진수를 네 개씩 끊고, 네 개의 숫자를 하나의 십육진수로 변환한 뒤 이어 붙인다.
- 이진수 \(11010101_{(2)}\)를 십육진수로 바꿔보자.
- \(1101_{(2)}\) → \(D_{(16)}\)
- \(0101_{(2)}\) → \(A_{(16)}\)
- 이를 종합하여 표현하면, \(11010101_{(2)}\) → \(DA_{(16)}\)
2. 0과 1로 문자를 표현하는 방법
- 문자 집합 : 컴퓨터가 인식할 수 있는 문자들의 모임.
- 인코딩(Encoding) : 문자 집합에 속한 문자들을 컴퓨터가 이해할 수 있는 0과 1로 변환하는 과정.
- 디코딩(Decoding) : 0과 1로 표현된 문자 코드를 사람이 읽을 수 있는 문자로 변환하는 과정.
아스키 코드
아스키는 초창기 문자 집합 중 하나로 영어 알파벳, 아라비아 숫자, 일부 특수 문자가 포함되어 있으며 7비트로 표현되기 때문에 128개의 문자를 표현할 수 있다.
EUC-KR
한글 인코딩에는 완성형 인코딩과 조합형 인코딩, 두 가지 방식이 존재한다.
- 완성형 인코딩 : 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식.
- 조합형 인코딩 : 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로하나의 글자 코드를 완성하는 인코딩 방식.
EUC-KR이란 한글을 2바이트 크기로 인코딩할 수 있는 대표적인 완성형 인코딩 방식으로, 아스키 코드보다 표현할 수 있는 문자가 많지만 모든 한글을 표현할 수는 없다.
유니코드와 UTF-8
언어별로 인코딩을 나라마다 할 경우 다국어를 지원하는 프로그램을 만들 때 각 나라별 인코딩을 모두 알아야 하는 번거로움이 있다. 유니코드는 여러 나라의 문자를 광범위하게 표현할 수 있는 통일된 문자 집합으로, 가장 많이 사용되는 문자 집합이다. 유니코드는 글자에 부여된 코드 포인트 자체를 인코딩된 값으로 삼지 않고 이 값을 UTF-8, UTF-16, URF-32 등의 다양한 방법으로 인코딩한다.
'CS > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] 명령어 (0) | 2023.02.20 |
---|---|
[컴퓨터구조] 컴퓨터 구조 시작하기 (0) | 2023.02.11 |