다루는 내용
- 문자형
- ASCII CODE
- 정수형
- 실수형
- float형의 메모리에 저장 방식
기본 형식 | |
char, unsigned char, signed char | 1 byte |
short, unsigned short | 2 bytes |
int, unsigned int | 2 or 4 bytes |
long, unsigned long | 4 bytes |
float | 4 bytes |
double | 8 bytes |
long double | 8 bytes |
1. 문자형
문자형은 1개의 문자를 표현(및 저장)할 수 있는 형식이다. 여러개의 문자를 표현하기 위해서는 메커니즘 형식인 배열(혹은 포인터)을 사용해야 한다.
문자형 | |
char, signed char | -127 ~ 128 |
unsigned char | 0~255 |
문자형 형식은 메모리 1바이트의 크기를 갖고 있기 때문에 256가지의 표현 범위를 넘는 데이터 표현에는 부적절하다.
문자형 형식으로는 NULL(0)을 포함한 127까지의 기본 문자에 부호를 포함하는 char(signed char는 char와 정확히 일치한다.)와 0~255까지 표현할 수 있는 unsigned char형이 있다.
그리고, C언어 사용자가 문자 표현을 용이하게 하기 위해 리터럴 문자 상수를 정의하고 있으며 이의 기준은 아스키 코드(ASCII code)이다.
리터럴
프로그래밍 언어에서는 데이터 값을 표현하기 위해 리터럴 상수를 제공하고 있다.
문자형을 위한 리터럴은 'a', 'b', ...와 같은 형태로 단일 따옴표 안에 한개의 문자를 표현 할 수 있다.
또한, '와 같은 단일 따옴표 처럼 이미 다른 목적으로 표현되거나 기능 키에 해당하는 문자를 escape문자라 하여 별도의 표현으로 리터럴을 정의하였다.
이러한 리터럴 문자의 경우 사용 목적은 char형 데이터 표현에 많이 사용되겠지만 C언어에서는 int형 형식으로 정의를 하였다. 그렇지만, char형의 경우 int형과 묵시적으로 형 변환을 처리해 주기 때문에 우리가 고민할 부분은 없다. 물론, C++언어에서는 좀 더 높은 신뢰성을 추구하는 철학이 있어서 그런지 문자형 리터럴 상수를 char형으로 취급하고 있다.
escape 문자 | |||||
'\a' | 경고음 | '\r' | 캐리지 리턴 | '\'' | 단일 따옴표 |
'\b' | back space | '\t' | 탭 | '\"' | 이중 따옴표 |
'\n' | 라인 변경 | '\\' | 백슬러시 | '\?' | 물음표 |
그리고, 문자열을 표현하기 위해 "abc"와 같이 이중 따옴표 안에 n개의 문자를 넣을 수 있게 하였으며 이를 문자열 리터럴 상수라 얘기한다.
이 외에 ..., -4, -3, -2, -1, 0, 1, 2, 4,...과 같이 정수표현에 대한 리터럴은 우리가 사용하는 수와 동일하게 제공하고 있고
숫자 앞에 0x(영엑스)를 붙여서 8진수 표현과 16진수 표현도 할 수 있게 하고 있다.
실수를 위해서는 -12.02과 같은 부동 소수점을 사용하는 표현과 을 제공하고 있고 -1.202e1과 같은 지수 표현도 할 수 있게 하고 있으며 실수에 대한 표현은 double형으로 정의되어 있으며 -12.02f 혹은 -1.202e1f와 같이 뒤에 f를 추가하면 float형에 대한 표현이 된다.
아스키 코드(ASCII code)
원래 아스키 코드는 컴퓨터 장치와 장치간에 제어 신호에 대한 정의였었는데 C언어를 비롯한 많은 프로그래밍 언어에서 문자형을 표현하는 기준이 되었다. (C#과 같은 언어에서는 표현은 가능하지만 기준은 아니다.)
ASCII code | |||||||||||
10진수 | 16진수 | 문자 | 10진수 | 16진수 | 문자 | 10진수 | 16진수 | 문자 | 10진수 | 16진수 | 문자 |
0 | 0 | NUL | 41 | 29 | ) | 81 | 51 | Q | 121 | 79 | y |
1 | 1 | SOH | 42 | 2A | * | 82 | 52 | R | 122 | 7A | z |
2 | 2 | STX | 43 | 2B | + | 83 | 53 | S | 123 | 7B | { |
3 | 3 | ETX | 44 | 2C | , | 84 | 54 | T | 124 | 7C | | |
4 | 4 | EOT | 45 | 2D | - | 85 | 55 | U | 125 | 7D | } |
5 | 5 | ENQ | 46 | 2E | . | 86 | 56 | V | 126 | 7E | ~ |
6 | 6 | ACK | 47 | 2F | / | 87 | 57 | W | 127 | 7F | DEL |
7 | 7 | BEL | 48 | 30 | 0 | 88 | 58 | X | NUL:NULL SOH: 데이터 전송 시작 STX: 본문 시작 ETX: 본문 종료 EOT:전송 종료 ENQ:응답 요구 ACK: 긍정 응답 BEL: 경고음 BS:Back Space HT:수평 탭 LF:개행 VT:수직 탭 FF 다음 페이지 CR:Carriage Return SO: 확장문자 시작 SI:확장문자 종료 DEL: 전송 제어 확장 DC1: Device Control 1 DC2: Device Control 2 DC3: Device Control 3 DC4: Device Control 4 NAK:부정 응답 SYN:Synchronous idle ETB:전송 블록 종료 CAN:취소 EM: 매체 종료 SUB:치환 ESC FS:파일 경계 GS:그룹 경계 RS:레코드 경계 US:장치 경계 | ||
8 | 8 | BS | 49 | 31 | 1 | 89 | 59 | Y | |||
9 | 9 | HT | 50 | 32 | 2 | 90 | 5A | Z | |||
10 | 0A | LF | 51 | 33 | 3 | 91 | 5B | [ | |||
11 | 0B | VT | 52 | 34 | 4 | 92 | 5C | \ | |||
12 | 0C | FF | 53 | 35 | 5 | 93 | 5D | ] | |||
13 | 0D | CR | 54 | 36 | 6 | 94 | 5E | ^ | |||
14 | 0E | SO | 55 | 37 | 7 | 95 | 5F | _ | |||
15 | 0F | SI | 56 | 38 | 8 | 96 | 60 | ` | |||
16 | 10 | DLE | 57 | 39 | 9 | 97 | 61 | a | |||
17 | 11 | DCI | 58 | 3A | : | 98 | 62 | b | |||
18 | 12 | DC2 | 59 | 3B | ; | 99 | 63 | c | |||
19 | 13 | DC3 | 60 | 3C | < | 100 | 64 | d | |||
20 | 14 | DC4 | 61 | 3D | = | 101 | 65 | e | |||
21 | 15 | NAK | 62 | 3E | > | 102 | 66 | f | |||
22 | 16 | SYN | 63 | 3F | ? | 103 | 67 | g | |||
23 | 17 | ETB | 64 | 40 | @ | 104 | 68 | h | |||
24 | 18 | CAN | 65 | 41 | A | 105 | 69 | i | |||
25 | 19 | EM | 66 | 42 | B | 106 | 6A | j | |||
26 | 1A | SUB | 67 | 43 | C | 107 | 6B | k | |||
27 | 1B | ESC | 68 | 44 | D | 108 | 6C | l | |||
28 | 1C | FS | 69 | 45 | E | 109 | 6D | m | |||
29 | 1D | GS | 70 | 46 | F | 110 | 6E | n | |||
30 | 1E | RS | 71 | 47 | G | 111 | 6F | o | |||
31 | 1F | US | 72 | 48 | H | 112 | 70 | p | |||
32 | 20 | Space | 73 | 49 | I | 113 | 71 | q | |||
33 | 21 | ! | 74 | 4A | J | 114 | 72 | r | |||
34 | 22 | " | 75 | 4B | K | 115 | 73 | s | |||
35 | 23 | # | 76 | 4C | L | 116 | 74 | t | |||
36 | 24 | $ | 77 | 4D | M | 117 | 75 | u | |||
37 | 25 | % | 78 | 4E | N | 118 | 76 | v | |||
38 | 26 | & | 79 | 4F | O | 119 | 77 | w | |||
39 | 27 | ' | 80 | 50 | P | 120 | 78 | x | |||
40 | 28 | ( | 83 | 53 | S | 126 | 7E | ~ |
위 처럼 리터럴 상수를 표시를 하면 해당하는 ASCII code값이 출력됨을 볼 수 있다.
2. 정수형
정수형은 음수를 포함해서 표현하는 short, int, long과 표현하지 않는 unsigned short, unsigned int, unsigned long을 제공하고 있다.
표현할 수의 범위에 따라 선택할 수 있을 것이며 int는 컴파일러나 O/S에 따라 2바이트인 경우와 4바이트인 경우가 있는데 대부분 프로그램에서는 이에 대한 고민을 하지 않는다 해서 문제가 되지는 않는다. 다만 실제 작성할 프로그램이 이러한 것이 문제가 될 요소가 있다면 short와 long형을 사용할 수는 있을 것이다. 그렇지만 모든 프로그래밍을 할 때 그런 습관은 이미 많은 개발자들이 쌓아놓은 습관을 등질 수 있는 길이라 고독할 것이며 프로젝트 규모가 커져 같이 프로그래밍 작업을 요구하는 시대적 요구에 비추어 보았을 때 결코 적절한 선택은 아니라 본다.(물론, 잘못된 선택이라 비난할 수는 없을 것이다. but, …)
또한, 컴파일러에 따라 8바이트를 표현할 수 있는 long long 형식이나 double long형식을 제공하는 경우도 있다.
정수형 | |
short, unsigned short | –32,768 ~ 32,767 |
unsigned short | 0 to 65,535 |
int | short 이나 long과 같음 |
unsigned int | unsigned short이나 unsigned long과 같음 |
long | –2,147,483,648 ~ 2,147,483,647 |
unsigned long | 0 ~ 4,294,967,295 |
3. 실수형
0.5에서 0.6 사이에는 몇 개의 실수가 있는가? 무한 개의 실수가 있다는 것은 모두 알고 있는 사실일 것이다. 그렇다면 컴퓨터에서 실수는 어떻게 표현하고 어떻게 메모리에 저장이 될까?
정답은 근사치이다. 즉, 실수형은 정확한 수치 표현이 불가능하기 때문에 특정 오차 범위의 데이터를 표현할 수 밖에 없다.
정확한 실수는 컴퓨터로 표현될 수 없다.
0.1을 몇 번을 더하면 과연 1.0일 되는가? 다음 그림을 보고 판단을 해 보라.
그렇다면 실수는 메모리에 어떻게 저장이 되는가?
부호를 표현하는 비트와 지수부, 가수부를 표현하는 비트가 약속되어 있다. 다음 그림은 float형의 경우이다.
참고로 double형은 부호 비트 1비트, 지수부가 11비트이고 가수부가 52비트이다.
예를 들어 -12.875라는 수가 어떻게 저장되는지 살펴보자.
-12.875 = - (12.875) = - (12 + 0.875)
12 는 이진수로 1100 이라는 것을 알 것이다.
0.875 = 0.5(2의 -1승) + 0.25 (2의 -2승) + 0.125(2의 -3승)
따라서
-12.875= - 1100.111(2) = -1.100111 (2) * 2의 3승
부호비트는 1
지수부는 3이므로 10000010
가수부는 10011100000000000000000 이다. (맨 앞의 1.은 언제나 동일하므로 메모리에 표현하지 않고 생략한다.)
즉, 1100 0001 0100 1110 0000 0000 0000 0000
c 1 4 e 0 0 0 0
'언어 자료구조 알고리즘 > C 언어 문법' 카테고리의 다른 글
11. 산술 연산자 (0) | 2009.08.19 |
---|---|
10. 연산자 (0) | 2009.08.19 |
9. 변수의 종류 (0) | 2009.08.19 |
8. 변수의 선언과 초기화 (5) | 2009.08.19 |
7.사용자 정의 형식 - 구조체, 공용체, 열거형 (0) | 2009.08.19 |
6.메커니즘 형식 - 배열, 포인터 (0) | 2009.08.19 |
4. 형식(type -자료형) (0) | 2009.08.19 |
3.헤더파일과 소스파일의 내용 (0) | 2009.08.19 |
2. 프로그램 구성 요소 (0) | 2009.08.19 |
1.프로젝트 생성 (0) | 2009.08.19 |