Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 05 [자료형1]

2018. 7. 8. 14:54

 제 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
'Study/C언어' 카테고리의 다른 글
  • 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 07 [입력문과 출력문(printf, scanf, scanf_s)]
  • 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 06 [자료형2]
  • 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 04 [변수]
  • 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 03 [C언어와의 첫만남]
Eskeptor
Eskeptor
Eskeptor
Hello World
Eskeptor
전체
오늘
어제
  • 분류 전체보기 (138)
    • Computer (5)
      • Linux (1)
      • Hardware (2)
      • Software (0)
      • Tips (1)
      • Website (0)
    • Mobile (1)
      • Application (1)
    • Study (108)
      • Android (9)
      • C언어 (45)
      • C++ (17)
      • Unity 5(유니티5) (11)
      • Qt 프로그래밍 (2)
      • MFC (12)
      • C#, Winform (12)
    • My World (24)
      • OpenPad(Android) (12)
      • 한글 패치 (1)
      • C#으로 만든 귀요미들 (5)
      • MFC로 만든 귀요미들 (6)
    • Life Goes On (0)
      • Hip Hop (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 메모장
  • 강좌
  • 왕초보
  • C#
  • 강의
  • 비행기
  • 포인터
  • 자바
  • Unity
  • 자료구조
  • 초보
  • 배열
  • 알고리즘
  • Java
  • C언어
  • 만들기
  • 유니티
  • 슈팅게임
  • c++11
  • 안드로이드
  • Android
  • 오픈패드
  • 테트리스
  • Tetris
  • openpad
  • 기초
  • 기본
  • 프로그래밍
  • C++
  • MFC

최근 댓글

최근 글

hELLO · Designed By 정상우.
Eskeptor
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 05 [자료형1]
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.