본문 바로가기
c

c언어 4강 chap5 상수와 기본자료형(p.106~)

by 킹차니 2021. 3. 14.

c언어가 제공하는 기본 자료형의 이해

자료형이란? 자료형은 데이터를 표현하는 기준이다. 때문에 변수도 상수도 자료형에 근거한다.

자료형은 데이터를 표현하는 방법이다. 변수는 데이터의 저장을 위해서 할당된 메모리 공간에 붙여진 이름이다.

메모리 공간의 할당에 앞서 다음의 내용이 정해져야 한다.

1. 정수를 저장? 실수를 저장?

2. 정수 또는 실수를 저장하기 위해 몇 바이트를 사용할까?

위 두 질문에 "int"라는 답을 한다면, 이는 "정수를 저장할 것이고 메모리는 4바이트를 할당하겠다"는 말이다.

 

                    자료형                                               크기                                           값의 표현 범위             

정수형  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*10^-37 ~ +- 3.4*10^+38

 실수형 double

8바이트

 +- 1.7*10^-307 ~ +- 1.7*10^+308

 실수형 long double

 8바이트 이상

 double 이상의 표현 범위

  

 

근데 위의 표처럼 자료형 별 크기를 정확히 제한하지는 않음.

위와 같은 자료형이 다양한 이유는 두 가지가 있다.

1. 데이터의 표현방식이 다르므로, 최소 둘 이상의 자료형이 필요.

2. 메모리 공간의 적절한 사용을 위해서 디양한 크키의 지료형이 필요.

 

 

#sizeof 연산자

 

size​of : 메모리 공간에서 소모하는 메모리의 크기를 바이트 단위로 계산해서 반환한다. 그리고 이 연산자의 피연산자로는 변수와 상수뿐 아니라, 자료형의 이름도 올 수 있다. sizeof()는 함수처럼 보이지만 연산자이다!

 

int main(void) {

    char ch = 9;
    int inum = 1052;
    double dnum = 3.141592;
    printf("변수 ch의 크기:%d \n",sizeof(ch));
    printf("변수 inum의 크기:%d \n",sizeof(inum));
    printf("변수 dnum의 크기:%d \n",sizeof(dnum));
    printf("char의 크기:%d \n",sizeof(char));
    printf("int의 크기:%d \n",sizeof(int));
    printf("double의 크기:%d \n",sizeof(double));
}

출력결과:

변수 ch의 크기:1 

변수 inum의 크기:4 

변수 dnum의 크기:8 

char의 크기:1 

int의 크기:4 

double의 크기:8

 

 

# 정수를 표현 및 처리하기 위한 일반적인 자료형의 선택 

 

"일반적으로 CPU가 처리하기에 가장 적합한 크기의 정수 자료형을 int로 정의한다. 따라서 int형 연산의 속도가 다른 자료형의 연산속도에 비해서 동일하거나 더 빠르다."
​이렇다 보니 int보다 작은 크기의 데이터는 int형 데이터로 바꿔서 연산이 진행된다. 그리하여 연산의 대상이 되는 변수, 연산이 빈번하게 일어날 변수라면 작은 수라도 int형 변수로 선언하는 것이 좋다.

 

 

# 실수를 표현 및 처리하기 위한 일반적인 자료형의 선택

 

실수형 데이터가 표현할 수 있는  값의 표현범위는 매우 넓다. 따라서 double이냐 float형 이냐를 결정할 때에는 값의 표현범위도 중요하지 않다. 중요한 것은 정밀도

​정밀도: 오차가 발생하지 않는 소수점 이하의 자릿수.

float보다 double형의 정밀도가 더 좋다(소수점 15자리까지) 따라서 정수 자료형에서는 int를 보편적으로 선택하듯이 실수 자료형에서는 double을 보편적으로 선택한다.

 

 

# unsigned

 

char형 변수의 경우 -128이상 127이하의 범위이다. 하지만 unsigned를 앞에 붙여 unsigned char를 붙이면 값의 범위가 0이상 255이하가 된다.

unsigned를 붙이면 가장 왼쪽 비트인 MSB마저 값의 크기를 나타내는 비트로 활용된다. 다시 말해 + - 의 구분이 사라져서 표현하는 모든 값은 0이상의 값이 되는 것이다.

1. 정수 자료형에 unsigned를 붙일 수 있다. 

2. unsigned가 붙으면 MSB도 데이터의 크기를 표현하는데에 사용된다.

3. 따라서 표현할 수 있는 값이 0이상의 범위도 두 배가 된다.

(참고로 정수 자료형 앞에 signed 선언도 추가 가능하다. 그러나 의미는 그대로임 int선언은 signed int 선언과 같은 의미이다. )

 

 

 

문자의 표현방식과 문자를 위한 자료형

 

# 아스키 코드

 

예로 문자 A는 숫자 65로 표현하고, B는 66으로 표현한다. 이러한 아스키코드는 알파벳과 특수문자를 포함하여 총128개의 문자로 이루어져 있다.

실제프로그램 상에서 문자는 ' '로 감싸서 표현한다. 이는 컴파일러에 의해서 숫자로 변환이 되고, 아스키코드 표준에 따른 문자로 변환되어 출력된다.

int main(void) {
    char ch1 = 'A' , ch2 = 65;
    int ch3 = 'Z', ch4 = 90;
    printf("%c %d \n",ch1,ch1);
    printf("%c %d \n",ch2,ch2);
    printf("%c %d \n",ch3,ch3);
    printf("%c %d \n",ch4,ch4);
    return 0;
}

출력결과:

A 65 

A 65 

Z 90 

Z 90 

 

위 예제를 보면 ch1과 ch2, ch3와 ch4가 각각 같은 수를 나타냄을 알 수 있다. 단, 서식문자 %c에 의해 문자의 형태로 출력되라는 명령을 받고 정수를 아스키 코드로 해석하여 아스키 코드 문자를 출력한다.

 

" 정수는 출력의 방법에 따라서 문자의 형태로도, 숫자의 형태로도 출력이 가능하다."

 

그리고 아스키 코드표에서 보듯이 아스키 코드값은 항상 0이상 127이하로 이루어져 있다. 따라서 이는 char변수로 충분히 커버 가능한 범위이다. char형은 문자의 표현을 위해 정의된 자료형이다.

 

*char형은 문자의 표현을 목적으로 만들어진 자료형이기에 '문자형'으로 분류되기도 한다. 하지만 char형은 정수형이다. 문자도 정수의 형태로 표현이 되고, 실제로 char형 변수에 저장되는 것은 정수이기 때문이다.