0. 2진수란?
컴퓨터는 2진수를 기반으로 데이터를 표현하고 연산도 진행합니다. 따라서 2진수를 이해해야 C언어를 보다 정확하게 이해할 수 있습니다. 2진수란 두 개의 기호를 이용해서 데이터를 표현하는 방식을 가리킵니다. 여기서 사용하는 두 개의 기호는 0과 1입니다. 컴퓨터의 내부에서는 전압의 고저, 펄스의 유무 등 2진(바이너리)현상에 의해서 2진수가 표시 되고 있습니다. 참고로 아라비아 숫자인 0, 1, 2,..., 9를 가리켜 '숫자 기호'라고 합니다. 이들은 수를 표현하는 기호인 셈입니다.
1. 2진수, 8진수, 10진수, 16진수
2진수와 마찬가지로 여덟 개의 기호를 이용해서 데이터를 표현하는 방식을 8진수라고 하고, 열 개의 기호를 이용해서 데이터를 표현하는 방식을 10진수, 열 여섯개의 기호를 이용해서 데이터를 표현하는 방식을 16진수라고 합니다. 또한 숫자 기호의 수는 10개밖에 없으므로 모자라는 개수의 기호를 표현하기 위해서, 문자기호를 도입합니다. 그래서 문자 A는 정수 10, 문자 B는 정수 11, 그리고 문자 F는 정수 15를 의미하도록 정의하였습니다. 다음은 2진수, 8진수, 10진수, 16진수를 비교한 표입니다.
2진수 | 8진수 | 10진수 | 16진수 |
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
10 | 2 | 2 | 2 |
11 | 3 | 3 | 3 |
100 | 4 | 4 | 4 |
101 | 5 | 5 | 5 |
110 | 6 | 6 | 6 |
111 | 7 | 7 | 7 |
1000 | 10 | 8 | 8 |
1001 | 11 | 9 | 9 |
1010 | 12 | 10 | A |
1011 | 13 | 11 | B |
1100 | 14 | 12 | C |
1101 | 15 | 13 | D |
1110 | 16 | 14 | E |
1111 | 17 | 15 | F |
10000 | 20 | 16 | 10 |
10001 | 21 | 17 | 11 |
10010 | 22 | 18 | 12 |
10011 | 23 | 19 | 13 |
10100 | 24 | 20 | 14 |
10101 | 25 | 21 | 15 |
10110 | 26 | 22 | 16 |
10111 | 27 | 23 | 17 |
11000 | 30 | 24 | 18 |
11001 | 31 | 25 | 19 |
11010 | 32 | 26 | 1A |
11011 | 33 | 27 | 1B |
11100 | 34 | 28 | 1C |
11101 | 35 | 29 | 1D |
11110 | 36 | 30 | 1E |
여기서 주목해야 할 점은 자릿수입니다. 10진수는 정수 9 다음에 자릿수가 증가합니다. 왜냐하면 한 자릿수를 가지고 표현할 수 있는 최댓값이 9이기 때문입니다.
9 →자릿수 증가→ 10
99 →자릿수 증가→ 100
마찬가지로 2진수는 한 자릿수 내에서 표현할 수 있는 최댓값이 1이므로 1 다음에 자릿수가 증가합니다.
1 →자릿수 증가→ 10
11 →자릿수 증가→ 100
8진수는 한 자릿수 내에서 표현할 수 있는 최댓값이 7이므로 7 다음에 자릿수가 증가하며
7 →자릿수 증가→ 10
77 →자릿수 증가→ 100
16진수는 한 자릿수 내에서 표현할 수 있는 최댓값이 F이므로(10진수로 15) F 다음에 자릿수가 증가하게 됩니다.
F →자릿수 증가→ 10
FF →자릿수 증가→ 100
*8진수와 16진수를 이용하여 데이터 표현하기*
C언어는 10진수 이외에 8진수와 16진수의 데이터 표현도 허용합니다. 따라서 변수 선언 후에 10진수가 아닌, 16진수나 8진수로 값을 채울 수 있습니다. 그 방법은 다음과 같습니다.
int num1 = 10; // 특별한 선언이 없으면 10진수 표현
int num2 = 0xA; // 0x로 시작하면 16진수로 인식
int num2 = 012; // 0으로 시작하면 8진수로 인식
표현의 방식이 다르다고 해서 저장되는 값이 달라지지는 않습니다. 따라서 위의 세 문장에 의해서 변수에 초기화되는 값은 모두 동일합니다. 물론 컴퓨터는 내부적으로 2진수의 형태로 값을 저장합니다.
2. 비트(Bit)와 바이트(Byte)
'비트'는 컴퓨터가 표현하는 데이터의 최소단위로서 2진수 값 하나를 저장할 수 있는 메모리의 크기를 뜻하는 단위입니다. 또한 비트를 여덟 개로 묶으면 '바이트'가 됩니다.
<1비트>
<1바이트>
위 그림은 컴퓨터의 메모리를 표현한 것입니다. 0또는 1을 표현하는 각각의 작은 사각형은 메모리의 최소 단위인 비트를 의미합니다.
다음은 1바이트 2진수로 표현된 값을 10진수로 변환한 것입니다.
위 결과를 통해 각각의 비트가 나타내는 값의 크기를 다음과 같이 알 수 있습니다.
그리고 이 결론을 이용하면 2진수를 10진수로 간단히 변환할 수 있습니다.
예를 들어 2진수 00101001은
\((2^{0}\times1) + (2^{1} \times 0) + (2^{2} \times 0) +(2^{3} \times 1) + (2^{4} \times 0) + (2^{5} \times 1) + (2^{6} \times 0) + (2^{7} \times 0) \)
로 계산합니다.
참고자료 : 윤성우, 「열혈 C프로그래밍」, ORANGE MEDIA, 2013
'프로그래밍 > C 언어 기초' 카테고리의 다른 글
6. C 기본 자료형 이해하기2(상수, 자료형의 변환) (0) | 2021.09.24 |
---|---|
5. C 기본 자료형 이해하기 (C정수형, C실수형, 자료형크기, sizeof, 문자형, 아스키코드) (0) | 2021.09.24 |
4. C 비트연산자(연산자 &, |, ^, ~, <<, >>, and, or, xor, 비트 반전, 비트 이동) (2) | 2021.09.24 |
2. C 연산자와 변수 (C변수선언, C연산자, C 수학연산, C 산술, C산수, 비교, 논리, and, or) (0) | 2021.07.26 |
1. C언어의 기본 (C언어 시작하기, C파일생성, 소스코드, C기본코드, C언어 함수, C주석) (0) | 2021.07.20 |