컴퓨터는 2진수를 사용하여 데이터를 표현하고 연산합니다. 따라서 우리는 먼저 2진수에 대한 이해가 필요합니다.
2진수란 무엇일까요?
2진수란 2개의 숫자만을 사용해서 데이터를 표현하는 방식인데요, 이와 유사하게 10개의 숫자를 사용하여 데이터를 표현하는 10진수도 있고요, 16개를 사용하는 16진수도 있습니다.
우리가 흔히 사용하는 10진수는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9로 되어있죠.
보시다시피 16진수는 숫자기호가 10개 밖에 되지않아 문자까지 사용되었습니다. 그래서 A는 10 B는 11 F는 15입니다.
참고로 16진수는 대소문자를 구분하지 않습니다.
2진수를 처음 접하게 되면 익숙하지 않아서 어려워 보이실테지만 그리 어렵진 않습니다.
각 자리수에서 의미하는 것은 2의 거듭제곱입니다.
여기서 1이라고 되있는 부분들의 합을 구하면 그게 10진수 수입니다.
위 그림을 10진수로 바꿔볼까요?
(2^4 는 2의 4승입니다.)
2^4 + 2^3 + 2^1 = 16 + 8 + 2 = 26
26이네요.
이게바로 '기계어'입니다.
컴퓨터는 0과 1로만 된 수를 사용하여 모든 데이터를 표현 및 처리합니다.
그런데 컴퓨터가 2진수를 사용하니 2진수를 배워야 한다는 것은 알겠는데 16진수는 왜 알아야 할까요?
왜냐하면 2진수로 데이터를 표현하게되면 길이가 너무 길어져서 표현하기도, 한눈에 알아보기도 힘듭니다.
그래서 많은 사람들, 전자 및 컴퓨터 서적에서도 16진수를 많이 사용합니다.
그래서 2진수와 16진수 모두에 익숙해질 필요가 있습니다.
여러분이 직접 10진수 수를 2진수, 16진수로 바꿔보는 연습을 한 번 해보세요.
도움이 많이 될겁니다.
그럼 숫자를 8개 사용해서 표현하는 방식은 8진수라고 하겠죠? 10진수 아무 수나 8진수로 한 번 바꿔봅시다.
데이터의 표현단위인 비트와 바이트에 대해 알아보겠습니다.
'비트'는 컴퓨터가 표현하는 데이터의 최소단위이며 2진수 하나의 값을 저장할 수 있는 메모리 크기를 뜻합니다.
0101001에서 이 0과 1 숫자 하나하나가 '비트'입니다.
총 7개니 이것을 7비트라고 합니다.
이 비트가 8개 모이면 '바이트'라는 단위가 됩니다.
C언어에서 16진수 8진수 10진수를 표현하는 방법은 아래와 같습니다.
위 수는 모두 10진수로 10입니다.
변수에 저장되는 값은 모두 같습니다, 표현방식만 다를 뿐이죠.
%d는 10진수 정수를 표현하는 서식문자라고 배웠죠?
16진수 정수와 8진수 정수를 표현하는 서식문자도 있습니다.
바로 %x와 %o입니다.
예제 보시죠.
실행결과
지금 까지는 딱히 어려운거 없죠?
이번엔 정수의 표현방식에 대해 알아봅시다.
보통 4바이트 정수를 사용하지만 편의상 1바이트로 설명하겠습니다.
컴퓨터가 1바이트 메모리 공간에 정수 1을 저장하려면 어떻게 채워질까요?
이 처럼 가장 왼쪽에 있는 비트를 가리켜 MSB 라고 합니다. 이는 Most Significant Bit의 약자로 가장 중요한 비트 라는 뜻입니다.
위 그림의 경우 MSB가 0이고 크기가 1이므로 나타내는 값은 +1입니다.
그렇다면 00001001은 얼마일까요? MSB가 0이고 크기가 9이므로 +9입니다.
이 정도로 정수의 표현방식에 대해 이해가 완료되었습니다.
그럼 음의 값 표현방식에 대해 알아봅시다.
음의 정수를 표현하려면 2의 보수를 취해야 합니다.
혹시 음수는 그냥 MSB를 1로만 바꾸면 음수가 되지 않을까라는 생각을 해보셨나요?
이는 잘못된 표현입니다.
그림을 봅시다.
그냥 MSB를 1로 바꾼다면 5와 -5를 더한 연산이 0이 되지 않습니다.
그럼 음의 정수를 표현하는 방법을 보겠습니다.
일단 저음 3 에서 1의 보수를 취해줍니다. (1은 0으로, 0은 1로) 그 다음 +1을 해줍니다.
이게바로 2의 보수를 취하는 방법입니다.
+5랑 더했을 때 0이 되나 볼까요?
이번엔 실수 표현방식에 대해 배워봅시다.
실수를 표현하는 방식은 상당히 복잡하지만 우리는 그냥 개념만 알면 되니 걱정하지 맙시다.
그림 봅시다.
컴퓨터는 이 방식으로 실수를 표현하는 방식에는 오차가 존재합니다.
위 식으로는 모든 실수를 정확히 표현할 수 없기 때문입니다.
m과 e에 적당한 수를 대입해서 0을 만드는게 가능할까요?
불가능 합니다. 2의 n승은 절대로 0이 될 수 없기 때문이죠.
이렇게 컴퓨터는 실수를 정확하게 표현하는게 아니라 그 값에 가장 가까운 근사치를 표현하는 것입니다.
이 오차를 가리켜 '부동 소수점 오차'라고 합니다.
예제를 한 번 봅시다.
이 예제는 우리가 아직 배우지 않은 문법을 다루고 있습니다.
이 문법은 나중에 반복문에 대해 배울텐데 지금은 그냥 출력 결과만 확인합시다.
실행 결과
0.1을 100번 더하면 10이 나와야 정상인데 보시다시피 10.000002가 출력되었습니다.
이는 C언어에서만 발생하는 문제가 아닌 모든 프로그래밍 언어에서도 존재하는 문제입니다.
끝으로 "컴퓨터는 실수를 정확히 표현하지 못하여 근사치를 표현한다" 라고 결론을 내리겠습니다.
이번 강의는 여기서 마치도록 하겠습니다.
다음 강의는 Chapter 05에서 다루지 못한 연산자들에 대해 다룹니다.
다음 강의때 봐요~
'C언어 강의' 카테고리의 다른 글
(C언어 강의) Chapter -09 여러가지 자료형 (3) | 2016.07.08 |
---|---|
(C언어 강의) Chapter -08 비트 연산자 (2) | 2016.07.06 |
(C언어 강의) Chapter -06 데이터입력과 C언어 키워드 (0) | 2016.07.03 |
(C언어 강의) Chapter -05 변수와 연산자 - 2 (0) | 2016.07.02 |
(C언어 강의) Chapter -05 변수와 연산자 - 1 (0) | 2016.07.02 |