컴퓨터 구조론에 있어서 가장 기초가 되는 것은 바로 "데이터가 어떻게 표현되고 저장되는 지를 아는 것"입니다. 이를 제대로 모르는 개발자는 결코 고급 개발자로 성장할 수 없습니다. 이 포스팅에서는 데이터에서도 가장 기초가 되는 "숫자"를 표현하기 위한 "진법"에 대해서 알아보도록 하겠습니다.
비트와 바이트(Bit & Byte)
비트(Bit): Binary Digit의 줄임말인 비트는 "컴퓨터가 데이터를 나타내는 최소 단위"입니다. 1비트는 2가지 상태(OFF, ON 또는 0, 1)만 표현이 가능합니다. 1비트는 \(2^1\)개, 2비트는 \(2^2\)개, n비트는 \(2^n\)개의 숫자를 표현할 수 있습니다. 64bit 컴퓨터의 경우는 \(2^{64}\)개의 숫자를 표현할 수 있는 것입니다.
바이트(Byte): 8비트가 모이면 1개의 바이트가 만들어집니다. 1바이트는 8비트이므로 \(2^8\)개의 데이터 표현이 가능합니다. 영문자나 숫자는 보통 1바이트, 한글 1글자는 2바이트로 표현됩니다.
단위 | Byte | KB | MB | GB | TB | PB | EB |
의미 | Byte | Kilo Byte | Mega Byte | Giga Byte | Tera Byte | Peta Byte | Exa Byte |
용량 |
8 bit | 1024 byte | 1024 Kbyte | 1024 Mbyte | 1024 Gbyte | 1024 Tbyte | Pbyte |
2진수 | \(2^{10}\) | \(2^{20}\) | \(2^{30}\) | \(2^{40}\) | \(2^{50}\) | \(2^{60}\) | |
10진수 | \(10^{3}\) | \(10^{6}\) | \(10^{9}\) | \(10^{12}\) | \(10^{15}\) | \(10^{18}\) |
진법
많은 진법들이 세상에 존재하지만 우리가 집중해야 할 진법은 바로 "10진법", "2진법", "8진법", "16진법"입니다.
10진법(Decimal): 0부터 9까지 10개의 숫자를 한 묶음으로 해서 1자리씩 위로 올리는 방법입니다.
2진법(Binary): 0과 1이라는 두 개의 숫자만으로 수를 나타내는 진법이며, 2의 지수 승으로 자릿수를 올리는 방법입니다.
8진법(Octal): 0부터 7까지 8개의 숫자로 수를 표현하는 방법입니다.
16진법(Hexa-decimal): 0~9까지의 숫자와 A~F까지의 문자를 함께 사용하여 수를 표현하는 방법
10진수 | 2진수 | 8진수 | 16진수 |
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
17 | 10001 | 21 | 11 |
각 진법의 숫자를 비교하면 다음과 같습니다.
진법 변환
10진수를 2진수로 변환하기 (정수)
1. 10진수를 "2"로 나누고, 기록합니다.
2. 나눈 몫을 다시 변환하고자 하는 "2"로 나누고, 해당 나머지를 기록합니다.
3. 계속 이 방법으로 나누고 더 이상 나눌 수 없을 때 끝을 냅니다.
4. 마지막 몫과 기록한 나머지들을 순서대로 적으면 2진법 수가 나오게 됩니다.
Ex) 10진수 41은 2진수로 변환하면 101001이 나오게 됩니다!!
10진수를 2진수로 변환하기 (소수)
(0. 소수점이 있을 때 정수가 0이면 바로 계산하고, 정수가 0이 아니면 정수와 소수부분을 분리하여 계산합니다.)
Ex) "0.6875" 라면 바로 밑의 과정 진행, "35.6875" 라면 "35 + 0.6875" 로 정수와 소수를 따로 계산을 진행합니다.
1. 소수점이 있는 경우에는 소수점 아래의 소수 부분에 2를 계속 곱하면서 정수로 자리 올림이 발생하는지 확인합니다.
2. 이때 자리올림이 발생하는 경우 1이 소수점 자리에 위치하게 되고 자리올림이 발생하지 않는 경우에는 0이 소수점 자리에 위치하게 됩니다.
3. 이 과정을 계속 진행하여 소수점 아래 부분이 모두 "0"이 되는 경우 계산이 종료됩니다.
Ex) 0.6875 X 2 = 1.3750이 되는데 이때 올라간 정수 "1"은 2진수에서 0.1이 된다. 그리고 소수 부분만 다시 분리하여 0.3750을 만들고 다시 X 2를 진행합니다. 이때는 0.7500이 되기 때문에 정수 "0"이 그 다음 소수점 자리에 위치하여 0.10이 됩니다.
소수 부분을 변환하는 경우, 10진수에서는 유한 소수라고 하더라도 2진수에서는 무한 소수가 될 수 있습니다.
2진수를 10진수로 변환하기 (정수)
1. 2진수의 0과 1을 각 자릿수만큼의 2의 지수 제곱으로 곱합니다.
2. 각자 곱한 값들을 모두 더하면 계산은 끝이 납니다.
$$ \begin{align} 101001_{2} &= 1 \times 2^5 + 1 \times 2^3 + 1 \times 2^0 \\&= 1 \times 32 + 1 \times 8 + 1 \times 1 \\&= 32 + 8 + 1 \\&= 41_{10} \end{align} $$
2진수를 10진수로 변환하기 (소수)
1. 정수의 변환 방식과 동일하게 각 자릿수를 고려해 계산합니다.
2. 다만, 소수점 아래로 내려갈수록 지수 제곱이 커지고 마이너스를 붙여 계산합니다.
(소수점 아래로 내려갈수록 지수 제곱 자체는 작아진다는 뜻압나다. -1, -2, -3, -4 ...)
$$ \begin{align} 0.1011_{2} &= 1 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3} + 1 \times 2^{-4} \\&= 1 \times 0.5 + 1 \times 0.125 + 1 \times {0.0625} \\&= 0.5 + 0.125 + 0.0625 \\&= 0.6875_{10} \end{align} $$
진법 변환 정리
10진수 -> 2진수: 정수 부분과 소수 부분을 각각 2진수로 변환하고, 가운데 소수점을 찍어줍니다.
2진수 -> 10진수: 2진수의 각 자리의 숫자를 2의 지수 승에 맞추어서 더해주는 방식으로 변환합니다.
2진수 -> 8진수: 정수 부분은 "소수점을 기준으로 왼쪽 방향'으로 3자리씩, 소수 부분은 "소수점을 기준으로 오른쪽"으로 3자리씩 묶어서 변환합니다.
2진수 -> 16진수: 정수 부분은 "소수점을 기준으로 왼쪽 방향'으로 4자리씩, 소수 부분은 "소수점을 기준으로 오른쪽"으로 4자리씩 묶어서 변환합니다.
8진수/16진수 -> 2진수: 8진수 1자리는 "2진수 3비트"로, 16진수 1자리는 "2진수 4비트"로 풀어서 변환합니다.