정수의 진법 변환
n진수를 10진수로 변환
10001124382316=1×25+0×24+0×23+0×22+1×21+1×20=32+0+0+0+2+1=3510=4×81+3×80=32+3=3510=2×161+3×160=32+3=3510
각 자리의 수에 해당 자릿값을 곱한 뒤 모두 더하면 10진수 값을 구할 수 있다.
자릿값은 n1이 아니라 n0부터 시작한다는 점에 주의해야 한다.
2진수와 8진수 사이의 변환
10 001 011 011(2)=2133(8)
8은 23이므로 2진수 세 자리와 8진수 한 자리가 대응한다.
2진수를 8진수로 바꿀 때는 오른쪽부터 세 자리씩 묶어 각 묶음을 8진수 한 자리로 바꾼다.
왼쪽 끝 묶음이 세 자리가 되지 않으면 앞의 빈자리를 0으로 간주한다.
8진수를 2진수로 바꿀 때는 각 8진수 한 자리를 대응하는 세 자리 2진수로 바꾼다.
2진수와 16진수 사이의 변환
1 0101 1100 0011(2)=15C3(16)
16은 24이므로 2진수 네 자리와 16진수 한 자리가 대응한다.
2진수를 16진수로 바꿀 때는 오른쪽부터 네 자리씩 묶어 각 묶음을 16진수 한 자리로 바꾼다.
왼쪽 끝 묶음이 네 자리가 되지 않으면 앞의 빈자리를 0으로 간주한다.
16진수를 2진수로 바꿀 때는 각 16진수 한 자리를 대응하는 네 자리 2진수로 바꾼다.
10진수를 n진수로 변환
2 ) 35 ... 1 8 ) 35 ... 3 10 ) 35 ... 5 16 ) 35 ... 3
2 ) 17 ... 1 8 ) 4 ... 4 10 ) 3 ... 3 16 ) 2 ... 2
2 ) 8 ... 0 0 0 0
2 ) 4 ... 0
2 ) 2 ... 0 43(8) 35(10) 23(16)
2 ) 1 ... 1
0
10 0011(2)
n진법에서는 한 자리에 0부터 n-1까지, 모두 n개의 숫자를 사용한다.
2진수에서는 0과 1을 사용한다.
8진수에서는 0부터 7까지를 사용한다.
10진수에서는 0부터 9까지를 사용한다.
16진수에서는 0부터 F까지를 사용한다.
따라서 n으로 나눈 나머지는 n진수의 한 자리 숫자로 사용할 수 있다.
처음 구한 나머지는 가장 낮은 자리인 일의 자리다.
위의 10진수 예시를 보면 알 수 있다.
나머지는 일의 자리에서 높은 자리 순서로 쌓인다.
따라서 마지막 나머지부터 처음 나머지까지 거꾸로 읽는다.
실수의 진법 변환
2진수를 10진수로 변환
0.1012=1×2−1+0×2−2+1×2−3=0.5+0+0.125=0.62510
각 자리의 수에 해당 자릿값을 곱한 뒤 모두 더하면 10진수 값을 구할 수 있다.
10진수를 2진수로 변환
첫째 자리 구하기0.6252×0.6251.2501.250x1둘째 자리 구하기0.2502×0.2500.5000.500x2셋째 자리 구하기0.5002×0.5001.0001.000x3∴0.62510=x12−1+x22−2+x32−3+⋯+xn2−n=2×(x12−1+x22−2+x32−3+⋯+xn2−n)=x1+x22−1+x32−2+⋯+xn2−(n−1)=1+x22−1+x32−2+⋯+xn2−(n−1)=1=x22−1+x32−2+⋯+xn2−(n−1)=2×(x22−1+x32−2+⋯+xn2−(n−1))=x2+x32−1+⋯+xn2−(n−2)=0+x32−1+⋯+xn2−(n−2)=0=x32−1+⋯+xn2−(n−2)=2×(x32−1+⋯+xn2−(n−2))=x3+x42−1+⋯+xn2−(n−3)=1+x42−1+⋯+xn2−(n−3)=1=0.1012
등호 왼쪽의 0.625는 10진수로 적은 값이고, 오른쪽은 그 값을 2진수 자릿값의 합으로 나타낸 식이다.
0.625의 2진수 표현을 아직 모르므로, 0.x1x2x3⋯2처럼 각 자리를 미지수로 둔다.
이 수에 2를 곱하면 2진수의 각 자리가 왼쪽으로 한 자리씩 이동하여, 첫 번째 소수 자리 x1이 일의 자리가 된다.
이는 10진수 0.123에 10을 곱해 1.23을 만들면, 소수점 아래 첫째 자리의 1이 정수 부분의 일의 자리로 옮겨가는 것과 같은 원리이다.
둘째 자리 구하기에서 앞 단계에서 남은 소수 부분 0.250에 2를 곱해 x2를 구한다.
세 번째 단계도 같은 방식으로 0.500에 2를 곱해 x3를 구한다.
이제 남은 소수 부분이 모두 0이므로 계산을 마친다.
매 단계마다 이 전개식을 쓰지 않고 쉽게 계산하는 방법이 있다.
0.3125×20.625×20.25×20.5×2∴0.312510=0.625=1.25=0.5=1.0=0.01012⇒0⇒1⇒0⇒1
10진수에 2를 곱하고, 결과의 정수 부분을 순서대로 기록한다.
각 단계에서는 이전 단계 결과의 소수 부분만으로 계산을 진행하며, 소수 부분이 0이 될 때까지 이를 반복한다.
2진수로 정확히 표현할 수 없는 실수
앞에서는 10진수 소수를 2진수 소수로 변환하는 방법을 살펴보았다.
그런데 모든 10진수 소수가 2진수에서 유한소수로 끝나는 것은 아니다.
그 이유를 이해하기 위해, 먼저 10진수에서 유한소수가 되는 조건부터 살펴보자.
10진수에서 어떤 수를 10kn 꼴로 표현할 수 있다면, 유한소수가 된다.
즉 기약분수의 분모의 소인수가 2와 5뿐이면 유한소수다.
103625=1000625=85=235=0.625
10진수로 표현한 어떤 수를 2kn 꼴로 나타낼 수 있다면, 그 수는 2진수에서 유한소수가 된다.
0.3125를 기약분수로 나타내면 다음과 같다.
0.3125=100003125=165=245
분모가 24이므로 0.3125는 2진수에서 유한소수가 된다.
0.01012=1×2−2+1×2−4=41+161=165
따라서 10진수 0.3125는 2진수로 변환하면 유한소수 0.01012이 된다.
반면 0.110=101=2×51의 기약분수 분모에는 5가 남는다.
분모가 2의 거듭제곱이 아니므로 0.110은 유한한 2진수 소수로 표현할 수 없다.
2를 계속 곱해 변환해 보면 소수 부분이 0.2→0.4→0.8→0.6을 반복한다.
0.1×20.2×20.4×20.8×20.6×20.2×20.4×20.8×20.6×20.2×2=0.2=0.4=0.8=1.6=1.2=0.4=0.8=1.6=1.2=0.4⇒0⇒0⇒0⇒1⇒1⇒0⇒0⇒1⇒1⇒0
∴0.110=0.0001100110011⋯2=0.000112
10진수 값을 2진수로 변환했을 때, 그 값을 유한한 비트 수로 정확히 표현할 수 있든 없든 변환 결과의 비트열이 실제 메모리에 그대로 저장되는 것은 아니다.
컴퓨터는 2진수로 표현된 값을 일정한 규칙에 따라 부호, 지수, 가수로 나누어 비트에 저장한다.
이러한 부동소수점 저장 방식을 표준화한 대표적인 규격이 IEEE 754이다.