카메라 개발자 공부방(SW)

[6장] 자료형(data type) 본문

Langauge/C

[6장] 자료형(data type)

luckmart 2021. 9. 25. 13:14
반응형

자료형은 메모리를 어떤 용도로 얼만큼의 메모리 사용할지 관한 것으로 C언어에 미리 다 약속이 되어있답니다.
다음은 반드시 외워야 될 자료형입니다!

Data Type 부호 사용 용도 크기 표현 가능 범위
char   문자 1byte 0 ~ 255
short 있음(signed) 정수 2byte -32,768 - 32767
int  있음(signed) 정수 4byte -2,147,483,648 ~ 2,147,483,647
long  있음(signed) 정수 4byte -2,147,483,648 ~ 2,147,483,647
long long 있음(signed) 정수 최소 8byte 2^63 ~ 2^63 -1
float    소수점 4byte 대략 10^-38 ~
10^ 38
double   소수점 8byte 대략 10^-308 ~
10^ 308

char 형은 1byte라는 메모리 공간에 문자만 저장할 용도로 사용하겠다는 뜻이고
short, int, long, long long는 데이터 type 마다 메모리를 얼만큼 사용할지, 정수만 저장할 용도로 약속되어있습니다.

1byte는 8bit이기 때문에 할당된 비트에 따라 표현할 수 있는 범위가 다른데요.
1bit로 표현할 수 있는 가짓수는 2 가지고 (꺼진다(0), 켜진다(1))
2bit로 표현할 수 있는 가짓수는 4가지입니다. 00, 01, 10, 11
3bit로 표현할 수 있는 가짓수는 8가지입니다. 000, 001, 010, 011, 100, 101, 110, 111
n-bit는 2^n으로 데이터를 표현할 수 있답니다.

 

그리고 음수를 표현해야 된다면, 음수인지 아닌지 표기하는 bit가 하나 필요합니다. 
00000000 00000000 00000000 00000000(양수)

10000000 00000000 00000000 00000000(음수)

부호가 있는 수라면 signed 비트 수를 제외한 비트만큼만 데이터의 표현이 가능합니다.

부호가 없는 수라면 signed 비트 수까지 포함하여  더 많은 수의 정수를 표현 할 수 있습니다.

다음은 부호가 없는 unsigned에 대한 data type 표 입니다.

Data Type 부호 사용 용도 크기 표현 가능 범위
unsigned short 없음(unsigned) 정수 2byte 0 ~ 65,535
unsigned int 없음(unsigned) 정수 4byte 0 ~ 4,294,967,295
unsigned long 없음(unsigned) 정수 4byte 0 ~ 4,294,967,295
unsigned long long 없음(unsigned) 정수 최소 8byte 0 ~ 2^64

다음은 <inttypes.h>에 선언된 자료형에 대한 정보입니다(참고용).

Data Type 부호 사용 용도 크기 표현 가능 범위
int8_t 있음(signed) 정수 1 byte -128 ~ 127
uint8_t 없음(unsigned) 정수 1 byte 0 ~ 255
int16_t 있음(signed) 정수 2 byte -32,768 ~ 32,767
uint16_t 없음(unsigned) 정수 2 byte 0 ~ 65,535
int32_t 있음(signed) 정수 4 byte -2,147,483,648 ~ 2,147,483,647
uint32_t 없음(unsigned) 정수 4 byte 0 ~ 4,294,967,295
int64_t 있음(signed) 정수 8 byte 2^63 ~ 2^63 -1
uint64_t 없음(unsigned) 정수 8 byte 0 ~ 2^64
long long 있음(signed) 정수 최소 8 byte 0 ~ 2^64

 

또. 실수부와 정수부를 비트로 저장하는 방식에 차이가 있습니다.
실수의 표현은 정수부와 가수부로 비트를 나눠서 표현을 합니다.
(이 부분은 따로 일단 스킵하고 다음에 포스팅하겠습니다.)

미리 약속을 해놨기 때문에 정수형 data type엔 소수점을 저장할 수가 없게 됩니다.

#include <stdio.h>

int main()
{
    int val = 3.141592;
    printf("%d\n", val)
    return 0;
}

// 실행 결과
// 3

소수점을 다루기 위해선 float이나 double data type을 사용해야 합니다.

#include <stdio.h>

int main()
{
    float val = 3.141592f;
    printf("%f\n", val);
    return 0;
}

// 실행결과
// 3.141592f

그런데 data type이 다른 변수끼리 연산을 하면 어떻게 될까요?
경우에 따라 연산의 손실이 일어날 수 있습니다.

1) 실수형 데이터를 정수에 저장하는 경우

#include <stdio.h>

int main()
{
    float val = 3.141592f;
    int n = val;
    printf("%d\n", n);
    return 0;
}
// 실행결과
// 3

2) 작은 data type에 큰 data type의 값을 저장하는 경우

#include <stdio.h>

int main()
{
    int val = 500000;
    char n = val;
    printf("%d\n", n);
    return 0;
}
// 실행결과
// overflow

위의 연산들은 어쩔 수 없는 손실입니다.
1)의 경우는 실수를 저장하는 방식과 정수를 저장하는 방식이 다르기 때문에 소수점을 저장시킬 수 없습니다.
2)의 경운 표현할 수 있는 메모리 공간이 한정되었기 때문에 표현할 수 없습니다.

위의 경우가 아닌 경우라면 data type을 동일하게 맞춘 후 연산을 하는 것이 좋습니다.

#include <stdio.h>

int main()
{
    int val = 128;
    char n = (char)val; // ()연산은 형 변환 연산자입니다.
    printf("%d\n", n);
    return 0;
}
// 실행결과
// 128

형 변환은 변수 앞에 (dataType)을 작성해서 dataType을 변경시킬 수 있습니다.

(dataType) 변수 

#include <stdio.h>

int main()
{
    short value = 30 + 500 + 20;
    return 0;
}

기본적으로 아무 연산 표시가 없는 경우 default 연산은 int를 따라갑니다.
30, 500 ,20이 합산될 땐 int data type base로 연산됩니다.

 

 

'Langauge > C' 카테고리의 다른 글

[8장] 사용자 함수  (0) 2021.09.27
[7장] 변수의 초기화와 대입  (0) 2021.09.26
[5장] 반복문  (0) 2021.09.24
[4장] 조건 제어문  (0) 2021.09.23
[3장] 연산자  (0) 2021.09.22
Comments