리안이와 함께하는 세상

#1. 진수법 본문

STUDY !/배워보자 C언어

#1. 진수법

리안아범 2009. 8. 17. 13:10


 
프로그래밍에 대해 말하기에 앞서 컴퓨터에 대해서 이야기를 해야 할 것 같다.


   
컴퓨터는 어떻게 동작할까?
 
기본적으로 컴퓨터가 1 0으로 동작한다는 말을 많이 들어보았을 것이다. 1 0을 다시 말하면 On, Off이다. 무엇이 켜지고 무엇이 꺼진다는 말인가? 모두들 알고 있다시피 답은 전기다. 전기가 컴퓨터로 흘러 들어와 일정 전압 이상이 되면 컴퓨터가 On으로 인식하고, 그 이하라면 Off로 인식한다. 컴퓨터는 바로 이 전기의 입력과 출력의 두 가지 방법을 이용해서 모든 자료를 처리하고 표시한다. 이와 같이 컴퓨터가 이해할 수 있는 언어는 단 두 가지 밖에 없기 때문에, 컴퓨터를 배울 때 2진수를 배워야만 하는 것이다. 뿐만 아니라, 컴퓨터에서는 8진수와 16진수도 사용한다. 배우는 김에 한꺼번에 배워버리도록 하자

자 이제 진수법에 대해서 알아보자.


   
진수법?
 
수학을 배웠다면 거의 알고 있을 것이라 믿는다.
 
우리가 생활에 사용하는 10진수는 0~9까지 10개의 숫자를 이용한다. 1, 2, 3, ... , 9. 9보다 큰 수는 어떻게 표시할까? 바보 같은 질문이긴 하지만 10이다. 이와 같이 10진수는 0~9까지 총 10개의 숫자로 이루어진 숫자체계이다.
 2
진수도 이와 같은 방식으로 구성된다. 0, 1. 더 이상 표시할 수 있는 수가 없기 때문에 자릿수가 올라 간다. 10, 11. 더 표시할 수 없으므로 다시 한자리가 올라가서 100. 2진수는 0 1의 두 개의 수로 구성된 숫자체계이다. 일반화시키자면 n진법은 0~(n-1)의 숫자로 구성된 숫자체계가 된다.

 
진수법에 익숙해져보자.
 2
진수를 우리가 가장 흔하게 사용하는 10진수로 표시를 하면, 2진수 10 2, 2진수 100 4가 된다. 하나만 물어보자. 10진수 10이 왜 10인가. 10진수 이기 때문이다. 2진수를 사용하는 곳에서는 10진수 10 1010이다. 10진수에 익숙한 우리가 2진수 10 2로 인식하듯이. 즉 상대적인 개념이라는 말이다. 여러가지 숫자체계중 우리는 10진수를 사용하고 있을 뿐이다. 10진수를 이해하듯이 2진수를 이해하면 된다그렇다면 8진수는 어떨까? 역시 똑같다 1~8, 10~18, 20~88, 100. 8진수 100 10진수로 64이고, 2진수로는 110100이다.

 
모든 n진수에서 다음자리 수는 (앞자리수×n)이다. 2진수는 두가지 표현방법밖에 없기 다음자리에서도 역시 두가지 표현방법밖에 쓸 수가 없다. 0일때 두가지, 1일때 두가지. 해서 두가지 방법을 표현할 수 있는 방법이 두가지가 있으므로 곱셈법칙에 의해서 2×2 = 2^2이 된다. 이런식으로 세번째 자리는 2×2×2 = 2^3, n번째 자리는 2×2×2×...×2 = 2^n이다. 8진수도 10진수도 이와같다.



 2
진수, 8진수 16진수의 변환
 
자 이제 8진수를 더 자세히 살펴보자.
8
진수 100은 전개하면, (1×8^2) + (0×8^1) + (0×8^0) 이다. 여기서 8 2^3인 것을 알고 있을 것이다. 따라서 (1×(2^3)^2) + (0×(2^3)^1) + (0×(2^3)^0) 이된다.
 
지수가 2진수로 바뀌었으므로 2진수로 고쳐써보자. 1 2진수로도 1이기 때문에 1×(2^6) + 0×(2^3) + 0×(2^0) 이므로 1000000이다.
 
무슨 말을 하려는지 알겠는가?
 
아직 잘 모르겠다면, 다른수를 살펴보자.
 8
진수 527이 있다. 전개하면 5×(8^2) + 2×(8^1) + 7×(8^0) 이다. 2진수로 고쳐쓰면 5 101, 2 10, 7 110 이다. 따라서 101×(2^6) + 10×(2^3) + 110×(2^0)이 된다. 2진수는 각 자리수가 앞자리수의 2배 이므로,
1×(2^8) + 0×(2^7) + 1×(2^6) + 0×(2^5) + 1×(2^4) + 0×(2^3) + 1×(2^2) + 1×(2^1) + 0×(2^0)
이다.

 
합쳐서 써볼까?
 101010110.
복잡해 보인다. 조금 바꿔서 써보자 101 / 010 / 110.
 
자 이제 무슨말을 하려는지 대충 짐작이 가리라 믿는다. 5 2진수 표현이 101 이었고, 2 2진수 표현은 10, 7 2진수표현은 110이었다. 다시말해서 8진수는 각 자리수를 2진수 세자리로 고쳐쓸 수 있다. 8 2의 세제곱이기 때문이다. 그렇다면 16? 그렇다 2진수 네자리로 표시된다.

 
그럼 나머지 진수별 변환은 어떻게 해야할까???
안타깝게도 변환하려는 진수가 n제곱 관계에 있는 경우가 아니라면 10진수로 변환했다가 다시 고쳐야한다.

 16
진수
 
? 16진수?? 8진수가 1~8까지 한자리에 나타나는 수이므로, 16진수는 한자리에 9가 아닌 15까지 표현해야 한다. 우리가 아는 수는 1~9까지밖에 없는데 어떻게 15까지 표현할 수 있을까?
 
바로 알파벳을 사용한다. 10을 나타내는 A, 11을 나타내는 B, ... , 15를 나타내는 F. 16을 나타내는 G... 일까? 안타깝게도 16 10으로 표시한다. ㅋㅋ  때문에 16진수는 1~9,A~F까지를 사용한다.
역으로 2진수에서 8진수로 변환하려면 2진수 세자리를 묶어서 표현하면 된다. 예를 들어 2진수 1111011001은 세자리씩 나누면 001/ 111/011/001 이므로 8진수 1731이 된다.

 
소수표현
 
소수점 윗단에서 진수표현법은 이것으로 거의 다 배웠다. 이제 소수점으로 내려가보자!
10
진수에서 소수점 이하 한자리에서는 0.0~0.9까지 총 10개의 수가 있다. 1 10개로 나눈 것이다.
그렇다면 8진수는 어떨까 0.0~0.7까지 나올 것이다. 1 8개로 나누었다.
따라서 8진수 0.1로 써진다.
전개식으로 써보면 0.1 0×(8^0) + 1×(8^-1). 즉 소수점 윗자리와 똑같이 생각하면된다.


진수법 끝!


Ps.
솔직히 말해서 기초 프로그래밍에서 진수법은 거의 사용되지 않는다 -0-;;

'STUDY ! > 배워보자 C언어' 카테고리의 다른 글

#6. 화면 입력함수  (0) 2009.08.24
#5. 화면 출력함수  (0) 2009.08.21
#4. 문장의 구성요소  (0) 2009.08.20
#3. C언어의 구성요소(1)  (0) 2009.08.19
#2. C언어의 기초, 기본구조  (0) 2009.08.18