[1-5] 기본 자료형

프로그래밍에서 자료(데이터, data)는 변경 가능성에 따라 크게 변수와 상수로 나눕니다. 변수는 값을 변경할 수 있는 자료입니다. 반대로 상수는 값이 변하지 못하는 자료입니다. 변수와 상수는 형태(타입, type)에 따라 숫자, 문자, 메모리 주소 등을 취할 수 있습니다.

자료의 형태를 자료형(데이터형, data type)이라고 합니다.

C 언어는 다음과 같이 정수형, 부호형, 문자형, 실수형 등 다양한 자료형을 제공합니다.

[표] 자료형

자료형 설명
비 집합형 정수형 정수를 값으로 갖는 자료형
부호형 참, 거짓을 의미하는 1과 0만 값으로 갖는 1비트 자료형
문자형 8비트로 표현할 수 있는 문자를 값으로 갖는 자료형
포인터형 주소를 값으로 갖는 자료형
실수형 실수를 자료로 갖는 자료형
집합형 배열형 자료형이 같은 하나 이상의 요소로 구성된 자료형
열거형 하나 이상의 정수형을 요소로 갖는 자료형
구조체형 다양한 자료형을 요소 가질 수 있는 자료형
유니온형 같은 저장 공간을 차지하는 하나 이상의 다양한 자료형을 요소로 갖는 자료형

자료형이 많으니 뭔가 복잡해보입니다. 무기라는 큰 범주안에 도, 활, 창이 있습니다. 무엇이 더 좋다 나쁘다 보다는 쓰임새가 다른 것뿐이죠?

자료형도 마찬가지입니다. 다양하고 복잡해 보이기는 하지만 각자 적절한 쓰임새가 있습니다.

집합형은 상대적으로 더 복잡하므로 우선은 관우와 함께 비 집합형인 자료형에 대해 알아보겠습니다.

정수형

정수를 값으로 갖는 자료형입니다. 기본 정수형으로 int, short, long, long long, double이 있습니다.

int형은 경우에 따라 크기가 다릅니다.일반적으로 CPU에서 한번에 처리하는 비트 수와 같았는데, 64비트 시대에는 대부분의 OS에서 여전히 32비트 크기를 사용합니다. 최소 16비트를 보장합니다.

</table> ## 제갈량의 동남풍 ### 왜 int형의 크기는 경우에 따라 다를까요? 국제 C 표준은 실무 그룹 ISO/IEC JTC1/SC22/WG14에서 관리합니다. 그렇다고 이 그룹이 C 언어를 만든 건 아닙니다. 벨 연구소에 일하던 켄 톰슨과 데니스 리치가 유닉스 운영체제에서 사용하려고 1972년에 개발했습니다. 처음에는 벨 연구소의 첫 글자를 딴 'B 언어'였는데 데니스 리치가 이를 개선해 C 언어로 개명했습니다. 1978년 브라이언 커니핸과 데니스 리치가 『The C Programming Language』 초판을 출간했습니다. 아직 국제 기구에서 C 언어 표준을 지정하지 않던 시기라 이를 K&R C라고 불렀습니다. 2판은 ANSI C 표준(C89)을 따르고 있습니다. 그후 C99(1999년), C11(2011년), C18(2018)이 ISO 표준으로 발표되었습니다. 그런데 이 표준이라는 것이 일종의 스펙 가이드입니다. 예를 들어 "int형은 최소 16비트이다"와 같은 가이드라인을 제시하는 거죠. 가이드라인을 제시할 수밖에 없는 것이 C 언어는 8비트부터 64비트까지 다양한 코어에서 동작하는 최고의 저수준 언어입니다. C 언어보다 더 저수준 언어는 어셈블러뿐인데 어셈블로 다양한 주변 장치를 제공하며 (아예 OS가 없는 싱글 테스크만 도는 경우도 있지만) OS 역할까지 제공하는 프로그램을 구현하기에는 너무나 큰 비용이 듭니다. 따라서 다양한 환경에서 구동될 수 있도록 느슨한 규격으로 C 언어를 규정할 수밖에 없는 겁니다. |**風**| ## short형 short형은 int형의 절반 크기입니다. 메모리를 절약하는 용도로 주로 쓰입니다.
형식 지정자 %i 또는 %d
32비트일 때 : −2,147,483,648 ~ 2,147,438,647

16비트일 때 : −32,767 ~ 32,767 </td> </tr>

크기 64비트 MS 윈도우와 리눅스에서 일반적으로 32비트
기타 OS에 따라서 크기가 16, 34, 64비트일 수 있습니다.
형식 지정자 %hi
최소 −32,767 ~ 32,767 보장(16비트일 때)
크기 int형의 절반 크기(최소 16비트 보장)
long은 큰 수에 사용합니다. int형이 대부분 16비트로 다뤄지던 16비트 시절에는 long형이 주로 32비트였는데, 64비트 시대에도 여전히 32비트로 대부분 다뤄집니다. 최소 32비트를 보장합니다.
형식 지정자 %li
최소 -2,147,483,647 ~ 2,147,483,647 보장(32비트 일 때)
크기 최소 32비트 보장
> long long 형은 long의 두 배 크기입니다. long형이 32비트면 long lon형은 64비트입니다.
형식 지정자 %lli
64비트 일 때 : −9,223,372,036,854,775,807 ~ 9,223,372,036,854,775,807
크기 최소 64비트 보장
실제로 각 자료형 크기를 살펴보겠습니다. ```c #include int main(void) { printf("short size : %d\n", sizeof(short)); printf("int size : %d\n", sizeof(int)); printf("long size : %d\n", sizeof(long)); printf("long long size : %d\n", sizeof(long long)); return 0; } ``` [결과] ```c short size : 2 int size : 4 long size : 8 long long size : 8 ``` sizeof 지시어로 출력된 숫자는 바이트 단위입니다. 예상과 달리 long형이 8바이트(64비트)네요. 다시 한 번 말씀드리지만 C 언어에서 자료형 크기는 최소 크기만 보장하도록 규정되어 있습니다. 따라서 프로그램이 구동되는 환경에 따라서 그 크기가 달라질 수 있으므로 꼭 해당 환경에서 크기를 확인해보시기 바랍니다. 일반적으로 정수를 값으로 담는 용도로 사용합니다. ## 불리언형 불리언형Boolean type형은 참인지 거짓인지 둘 경우만 나타냅니다. 참은 true, 거짓은 false로 씁니다. 일반적으로 참은 1, 거짓은 0에 대응합니다. 헤더 stdbool.h / C99부터 제공합니다.
헤더 stdbool.h
지시어 bool
true, false
크기 1바이트
기타 C99 버전부터 제공합니다.
예제 ```c #include #include int main(void) { bool a1; bool a2; a1 = true; a2 = false; printf("a1 : %d\n", a1); printf("a2 : %d\n", a2); printf("bool size : %d\n",sizeof(bool)); return 0; } ``` [결과] ```c a1 : 1 a2 : 0 bool size : 1 ``` 부호형을 false, true로 출력하는 형식 지정자는 없습니다. 일반적으로 정수형 형식 지정자인 %d를 사용합니다. trues는 1, flase는 0입니다. 나에게 자유 아니면 죽음을 달라! 자유냐? 죽음이냐? 두 경우밖에 없으니 이런 경우 유용하겠네요. ## 문자형 8비트로 표현할 수 있는 문자를 값으로 갖는 자료형입니다.
지시어 char
-128~127
크기 1바이트
```c #include int main(void) { char a1; char a2; a1 = 0x41; a2 = 'A'; printf("a1 : %c\n", a1); printf("a2 : %c\n", a2); printf("char size : %d\n",sizeof(char)); return 0; } ``` [결과] ```c a1 : A a2 : A char size : 1 ``` a1과 a2 모두 알파벳 A입니다. char은 16진수 표기법으로 0x00부터 0xFF까지 값을 갖습니다. 8비트로 한 문자를 표현하는 아스키 문자표에서 0x41은 영문자 A입니다. 그래서 두 변수 모두 A를 갖습니다. 주로 문자를 담을 때 사용합니다. ## 제갈량의 동남풍 ### 아스키 문자표 영문 알파벳을 사용하는 문자인코딩 표준이다. ASCII라고 씁니다. 1963년 처음 미국 표준 협회(ASA)에서 발표했으며 1986년에 마지막 업데이트가 있었습니다. 총 7비트로 문자를 표현합니다. 출력 불가능한 제어 문자는 33개, 출력 가능한 문자는 95개로 총 128개 문자를 제공합니다. 0부터 10까지 아스키 문자표는 다음과 같습니다. [표] 숫자 0부터 10까지 아스키 문자표
이진법 십진법 십육진법 모양
011 0000 48 30 0
011 0001 49 31 1
011 0010 50 32 2
011 0011 51 33 3
011 0100 52 34 4
011 0101 53 35 5
011 0110 54 36 6
011 0111 55 37 7
011 1000 56 38 8
011 1001 57 39 9
다음은 알파벳 아스키 문자표입니다. [표] 알파벳 대소문자 아스키 문자표
이진법 십진법 십육진법 모양 이진법 십진법 십육진법 모양
100 0001 65 41 A 110 0001 97 61 a
100 0010 66 42 B 110 0010 98 62 b
100 0011 67 43 C 110 0011 99 63 c
100 0100 68 44 D 110 0100 100 64 d
100 0101 69 45 E 110 0101 101 65 e
100 0110 70 46 F 110 0110 102 66 f
100 0111 71 47 G 110 0111 103 67 g
100 1000 72 48 H 110 1000 104 68 h
100 1001 73 49 I 110 1001 105 69 i
100 1010 74 4A J 110 1010 106 6A j
100 1011 75 4B K 110 1011 107 6B k
100 1100 76 4C L 110 1100 108 6C l
100 1101 77 4D M 110 1101 109 6D m
100 1110 78 4E N 110 1110 110 6E n
100 1111 79 4F O 110 1111 111 6F o
101 0000 80 50 P 111 0000 112 70 p
101 0001 81 51 Q 111 0001 113 71 q
101 0010 82 52 R 111 0010 114 72 r
101 0011 83 53 S 111 0011 115 73 s
101 0100 84 54 T 111 0100 116 74 t
101 0101 85 55 U 111 0101 117 75 u
101 0110 86 56 V 111 0110 118 76 v
101 0111 87 57 W 111 0111 119 77 w
101 1000 88 58 X 111 1000 120 78 x
101 1001 89 59 Y 111 1001 121 79 y
101 1010 90 5A Z 111 1010 122 7A z
더 자세한 내용은 위키디백 '[ASCII](https://ko.wikipedia.org/wiki/ASCII)'에서 확인하세요. 참고로 영어권에서 컴퓨터가 발상했기 때문에 영어와 기호만 제공하고 다국어는 지원하지 않습니다. 다국어 표준은 유니코드로 대동단결했습니다. 유니코드에 대해서는 이후에 다시 다루겠습니다. |**風**| ## 실수형 > 실수형은 소숫점을 출력하는 자료형입니다. 대표적인 실수형으로 float형과 double형이 있으면 각각 단정도 정밀도, 배정도 정밀도를 제공합니다. float형은 단정도 정밀도를 제공합니다. C 언어에서는 IEEE 754 단정도 이진 부동소수점 형식(single-precision binary floating-point format )을 제공합니다. 32 크기입니다. </table> double형은 배정도 정밀도를 제공합니다. C 언어에서는 IEEE 754 배정도 이진 부동소수점 형식(single-precision binary floating-point format )을 제공합니다. 62 크기입니다.
형식 지정자 %f, %F (디지털 지수)

%g, %G, %e, %E, %a, %A(과학적 지수) </td> </tr>

크기 32비트
</table> 단정도의 두 배라서 배정도입니다. 이 용어는 좀 어렵습니다. floate형/double형, 각각 32비트/64비트 실수라는 점만 기억하면 됩니다. floate형과 double형에 대해 소스코드로 알아봅시다. ```c #include int main(void) { float f; double d; f = 0; d = 0; printf("f : %f\n", f); printf("d : %lf\n", d); printf("d : %le\n", d); printf("float size : %hi\n", sizeof(float)); printf("double size : %hi\n", sizeof(double)); return 0; } ``` [결과] ```c f : 0.000000 d : 0.000000 d : 0.000000e+00 float size : 4 double size : 8 ``` 소수점 아래을 포함하는 수를 다룰 때 사용하면 됩니다. ## 제갈량의 동남풍 ### 실수형은 어떻게 표현하나? 실수형은 32비트 단정도 부동소수점 형태의 IEEE 754 표준을 따릅니다. 부동소수점은 소수점 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 방식입니다. 최상위 비트는 부호를 표시하며, 나머지는 지수와 가수입니다. (가수) Х (밑수)(지수)처럼 표현합니다. ![정밀도](/assets/images/clang1-5-1.png) f위 위치가 변경되면 소수점 아래 정밀도가 달라지게 됩니다. 즉 소수점을 지정하는 위치가 달라지기 때문에 부동소수점입니다. 부동이라니! 그럼 소수점이 고정되어 있다는 이야기 아닌가 하는 의문이 드실 겁니다. 부동소수점에서 부는 아닐부(不)가 아닙니다. 떠돌이를 뜻하는 뜰부(浮)입니다. |**風**| ## 부호(signed, unsigned) 모든 변수 앞에는 부호를 지정하는 signed, unsigned가 붙을 수 있습니다. unsigned 는 부호가 있음, unsigned는 부호가 없음을 지정합니다. 변수 앞에 부호 지정이 없으면 기본값인 signed가 적용됩니다. ```c signed int i; unsigned int j; ``` 자료형별 크기와 값의 범위는 다음과 같습니다. [표] 숫자별 가용범위 ![숫자별 가용범위](/assets/images/clang1-5-2.png) 오늘은 많은 내용을 배워 머리가 좀 아플 겁니다. 향후에 각 자료형을 필요할 때마다 사용할 겁니다. 사용하면 내것이 되니까 너무 걱정 않으셔도 됩니다. 더 자세한 사항은 부록 1 '자료형 형식 지정자'를 참조하세요. **殺**

형식 지정자 %lf, %lF (디지털 지수)

%lg, %lG, %le, %lE, %la, %lA(과학적 지수) </td> </tr>

크기 64비트