제 5강) 자료형1 |
혹시 지난시간에 보았던 예제가 기억나시나요?
#include <stdio.h>
int main(void)
{
int num = 3; // num이라는 int형 변수를 생성하여 3이라는 값으로 초기화
printf("Hello World!!! \n"); // printf 함수를 사용
printf("num = %d \n", num); // printf 함수를 사용하여 num 출력
return 0 ; // 프로그램 종료
}
바로 이 예제입니다.
여기서 우린 아직 모르는 것이 있습니다.
int num = 3;
바로 이것이죠.
"이건 int형 변수 num인데 3이 저장되어 있는거 아닌가요?"
라고 하실 수 있습니다만, 아직 "int"라는 것에 대해서 우리는 자세히 알지 못합니다.
즉, 지난시간에 "변수 선언"하는 것을 배웠습니다만, 자료형에 대해서 정확히 배우지 않았죠.
그래서 이번 시간에 제대로 알아보도록 합시다.
자료형? |
변수는 "변수는 물건을 담는 상자" 라고 배웠습니다.
그리고 간단하게 자료형은 "상자의 부피" 라고 대충 배웠습니다.
그런데 사실 그게 전부라는...
그럼 자료형에는 어떤 것들이 있는지 알아봅시다.
자료형 | 크기 | 값의 범위 | |
정 수 형 |
char | 1바이트 | -128 ~ 127 |
short | 2바이트 | -32,768 ~ 32,767 | |
int | 4바이트 | -2,147,483,648 ~ 2,147,483,647 | |
long | 4바이트 | -2,147,483,648 ~ 2,147,483,647 | |
long long | 8바이트 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
실 수 형 |
float | 4바이트 | -3.4 x 10^-37 ~ 3.4 x 10^38 |
double | 8바이트 | -1.7 x 10^-307 ~ 1.7 x 10^308 | |
long double | 8바이트 이상 | double 이상의 범위 |
범위를 세세하게 외우는 것이 아닌 대충 저 정도 나오는 구나 라고 기억하시면 됩니다.
바이트(Byte) |
컴퓨터에서 크기를 나타내는 단위로 정수형에 속하는 자료형입니다. 1Byte = 8Bit 1KB = 1,000Byte(1024) 1MB = 1,000KB(1024) = 1,000,000Byte(1,048,576) |
위의 표에서 볼 수 있듯이 자료형은 크게 "정수형"과 "실수형"으로 나뉘게 됩니다.
정수형은 말 그대로 정수를 다루는 자료형으로 주로 쓰이는 변수는 "int" 입니다.
대표적으로 쓰이는 정수 자료형 int |
int는 4바이트 크기(2^32)의 자료형으로 최소 -2억부터 최대 +2억까지 표현이 가능한 자료형입니다. C언어에서 int는 CPU가 8비트면 기본적으로 8비트로, 32비트면 32비트로 유연하게 변동됩니다. 하지만 64비트의 경우에는 그대로 32비트를 유지하면서 64비트용 int를 따로 둡니다.(__int64) |
실수형은 말 그대로 실수를 다루는 자료형으로 주로 쓰이는 변수는 "double" 입니다.
대표적으로 쓰이는 실수 자료형 double |
double은 위의 표와 같이 많은 범위의 실수를 표현할 수 있는 자료형입니다. 컴퓨터에서의 실수계산은 "정확하지 않다"라고 합니다. double은 float보다 더 넓은 범위의 실수를 표현하기 때문에 정확도도 float보다 높습니다.(15자리) |
하지만 변수가 만들어지면 자료형 크기만큼 메모리 공간을 할당하게 된다는 점을 꼭 기억합시다.
즉, 1이라는 숫자를 표현하기 위해서 위와 같은 크기의 공간을 할당해야한다는 소리입니다.
(메모리가 부족한 시스템에서는 자료형을 잘 골라야겠죠?)
정수 자료형? |
변수 선언은 지난 시간에 배웠으므로 매끄럽게 진행이 가능하겠군요.
예제를 보도록 합시다.
#include <stdio.h>
int main(void)
{
char num_ch = 4;
short num_short = 4;
int num_int = 4;
long num_long = 4;
printf("num_ch의 값 : %d \n", num_ch);
printf("num_short의 값 : %d \n", num_short);
printf("num_int의 값 : %d \n", num_int);
printf("num_long의 값 : %d \n", num_long);
return 0;
}
(long long은 일부러 넣지 않았습니다.)
5~8번줄에서는 각각의 정수 자료형으로 만든 변수에 "4"라는 값을 넣어주었습니다.
10~13번줄에서는 위에서 만든 변수의 값을 출력해주는 printf함수를 호출하였습니다.
그리고 결과는 위의 사진과 같을 겁니다.
그럼 이렇게 예제를 바꾸어볼까요?
#include <stdio.h>
int main(void)
{
char num_ch = 127;
short num_short = -32768;
int num_int = 2147483647;
long num_long = -2147483648L;
// 뒤에 붙는 대문자 L은 현재 정수가 long이라는 것을 컴퓨터에 알려주는 겁니다.
// 기본적으로 L이 붙지 않으면 int로 인식합니다.
printf("num_ch의 값 : %d \n", num_ch);
printf("num_short의 값 : %d \n", num_short);
printf("num_int의 값 : %d \n", num_int);
printf("num_long의 값 : %d \n", num_long);
return 0;
}
각 숫자들이 어디서 본 숫자들 아닌가요?
바로 각 자료형들이 나타낼 수 있는 범위의 최대 또는 최소로 넣어보았습니다.
그래서 결과가 그대로 잘 나왔습니다.
그런데 변수에 들어간 값들을 최대 또는 최소범위를 넘어서게 넣으면 어떻게 될까요?
#include <stdio.h>
int main(void)
{
char num_ch = 129; // 정수 오버플로우
short num_short = -32770; // 정수 오버플로우
int num_int = 2147483650; // 정수 오버플로우
long num_long = -2147483670L; // 정수 오버플로우
// 뒤에 붙는 대문자 L은 현재 정수가 long이라는 것을 컴퓨터에 알려주는 겁니다.
// 기본적으로 L이 붙지 않으면 int로 인식합니다.
printf("num_ch의 값 : %d \n", num_ch);
printf("num_short의 값 : %d \n", num_short);
printf("num_int의 값 : %d \n", num_int);
printf("num_long의 값 : %d \n", num_long);
return 0;
}
이렇게 바꾸었더니
이렇게 엉뚱한 값을 보여줍니다.
이렇게 변수의 자료형이 표현하는 범위를 벗어나는 값을 넣게 되면 오버플로우, 언더플로우가 일어나게 된다고 합니다.
(Over + Flow, Under + Flow)
정수 자료형 - 문자 |
정수 자료형에서 가장 작은 범위를 나타내는 자료형은 바로 "char(캐릭터)"입니다.
그런데 이 char는 숫자를 나타내기보다는 ASCII코드를 통한 문자를 나타내는데 주로 사용합니다.
아스키코드(ASCII : American Standard Code for Information Interchange) |
정보교환을 위한 미국 코드 표준입니다. 0부터 127, 총 128개의 문자를 나타내는데 현재는 "유니코드(Unicode)"가 아스키코드 자리를 대신하고 있습니다. (아스키코드로는 영어와 숫자, 일부 특수문자를 제외한 것들을 표현할 수 없기 때문입니다.) 더 자세한 설명 : 위키백과 |
아스키코드에 따라서 영어 대문자 알파벳 A~Z는 숫자 65~90으로, 소문자 알파벳은 숫자 97~122로 표현합니다.
그럼 예제를 통해서 알아볼까요?
#include <stdio.h>
int main(void)
{
char ch1 = 65; // 숫자를 대입할 수 있다.
char ch2 = 'A'; // 문자를 직접 대입할 수 있다.
char ch3 = 67;
printf("ch1 : (%c, %d) \n", ch1, ch1);
printf("ch2 : (%c, %d) \n", ch2, ch2);
printf("ch3 - 2 : (%c, %d) \n", ch3 - 2, ch3 - 2);
return 0;
}
char의 경우에는 숫자를 직접 대입할 수 있고, 문자를 대입할 수 있습니다.
문자를 대입할 때는 꼭 '작은 따옴표'로 묶어야 합니다.
문자를 출력할 때는 %c를 사용하게 됩니다.
막간의 팁! printf에서 값을 가져오는 순서 |
값을 가져올 때는 다음과 같습니다. 큰따옴표 이후에 먼저 쓰인 순서대로 값을 가져오게 됩니다. 가져올 때 %d, %c와 같은 서식문자의 형식으로 가져오게 됩니다. (서식문자는 printf와 scanf를 배울때 봅시다.) |
출력 결과는 다음과 같습니다.
실수 자료형? |
예제를 먼저 보도록 합시다.
#include <stdio.h>
int main(void)
{
float num_float = 3.1415926535100%93238462F;
// 뒤의 F는 float형이라는 것을 알려주기 위함
// 실수의 기본값은 double 입니다.
double num_double = 3.1415926535100%93238462;
long double num_long_double = 3.1415926535100%93238462L;
printf("num_float : %.21f \n", num_float);
printf("num_double : %.21f \n", num_double);
printf("num_long_double : %.21Lf \n", num_long_double);
return 0;
}
원주율의 소수점 21자리까지 값을 float, double, long double에 각각 넣어주었습니다.
long double의 경우에도 뒤에 L을 붙여주어서 double이 아닌 long double임을 알려주었습니다.
출력할때는 float, double 상관없이 %f를 사용하게 되지만 long double의 경우에는 %Lf를 사용합니다.
그리고 기본적으로 소수 출력을 하게 되면 소수점 6자리까지만 나오게 되지만
"%.자릿수f"를 하게 되면 자릿수만큼 소수점아래의 수가 나오게됩니다.
그런데 이렇게 출력을 하게되면
이렇게 num_double과 num_long_double이 같게 나옵니다.
막간의 팁!! C언어에서 실수 소수점 정확도 |
float : 6자리 double : 15자리 long double : 18자리 이 자리를 넘어서게 되면 정확도를 보장하지 않습니다. |
위의 팁에 따르면 long double은 18자리수까지 정확해야하는데 그렇지가 않습니다.
그런데!!
여기서는 소수점 18자리까지 정확하게 나옵니다.
그 이유는 바로 "컴파일러" 때문입니다.
Visual Studio에서 사용하는 MSCompiler에서는 long double을 double과 같이 봅니다.
(관련 자료 : http://stackoverflow.com/questions/4089174/printf-and-long-double)
(관련 자료 : http://bytes.com/topic/c/answers/135253-printing-long-double-type-via-printf-mingw-g-3-2-3-a)
(관련 자료 : https://msdn.microsoft.com/ko-kr/library/s3f49ktz.aspx)
그렇기 때문에 VS를 사용하신다면 double과 같게 나오게되지만
리눅스나 GCC를 사용하게 되신다면 double과 같은 64비트가 아닌 80비트로 보게 됩니다.
그래서 double과 long double이 다르게 나옵니다.
다음시간에는 |
오늘은 자료형에 대해서 알아보았습니다.
하지만 아직 자료형에 대해서 조금 더 남았습니다.
다음시간에는 자료형의 나머지 부분에 대해서 알아보도록하겠습니다.
'Study > C언어' 카테고리의 다른 글
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 07 [입력문과 출력문(printf, scanf, scanf_s)] (0) | 2018.10.17 |
---|---|
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 06 [자료형2] (0) | 2018.07.08 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 04 [변수] (0) | 2018.07.08 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 03 [C언어와의 첫만남] (0) | 2018.07.08 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 00 [Visual Studio 2017 15.4.2버전에서 프로젝트 생성하기] (0) | 2018.07.08 |