언어 자료구조 알고리즘/C 언어 문법

5.기본 형식 - 문자, 정수, 실수형

언제나휴일 2009. 8. 19. 05:47
반응형
기본 형식 - 문자, 정수, 실수형 

 

다루는 내용

    - 문자형 

    - 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

 

 

 

반응형