2009. 8. 17. 13:10ㆍSTUDY !/배워보자 C언어
프로그래밍에 대해 말하기에 앞서 컴퓨터에 대해서 이야기를 해야 할 것 같다.
컴퓨터는 어떻게 동작할까?
기본적으로 컴퓨터가 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 |