본문 바로가기

프로그래밍/C 기초

[C언어 강좌] #4 - 자료형

안녕하세요

저번에 변수를 설명드리면서 자료형이 나왔었습니다.

오늘은 한번 더 자세하게 알아보도록 하죠.


자료형이란것은 데이터를 어떻게 사용할지 정해주는 방법이죠.

변수를 만들때 변수의 크기와 사용하는 방법을 알려주는 용도입니다.


자료형의 종류는 다음과같은것들이 있습니다.


1.정수형


 자료형

크기 

표현범위 

 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,807  ~ +9,223,372,036,854,775,807 



2.실수형


자료형 

크기 

표현범위 

 float

4바이트 

1.2E-38 ~ 3.4E+38

double 

8바이트 

 2.3E-308 ~ 1.7E+308

 long double

8바이트 이상 

double 이상의 표현범위 


(컴파일러마다 조금씩 다를수 있습니다)




우선 크기와 표현범위가 보이네요

각 자료형마다 표현할수 있는 범위가 다릅니다.


우리가 저번에 사용했던 int는 2^32가지 수를 표현할수 있습니다.


short는 -32,768부터 32,767까지 표현할수 있는데 여기에 40000이라는 숫자를 넣을수는 없는겁니다


그럼 무조건 큰게 좋은것 아니냐?


아뇨 그것도 아닙니다.

표현범위가 클수록 메모리를 사용하는 크기가 커지기때문이죠.

short를 보면 크기가 2바이트라고 적혀있습니다.


컴퓨터는 모든 수를 0과 1로 저장합니다. 이진수를 사용하는것이죠.

우리가 평소에 사용하는것이 10가지 숫자를 사용하는 십진수고 컴퓨터는 오직 저 2가지 숫자만을 사용합니다.


1비트는 0과 1을 담을수 있는 하나의 슬롯이고

그것이 8개가 있으면 1바이트가 됩니다.


1바이트는 0 0 0 0 0 0 0 0 이런식으로 생겨먹은거죠


한번 예를 들어서 0과 1만으로 1~10까지의 숫자를 표현해보겠습니다


1 : 0 0 0 0 0 0 0 1

2 : 0 0 0 0 0 0 1 0

3 : 0 0 0 0 0 0 1 1

4 : 0 0 0 0 0 1 0 0

5 : 0 0 0 0 0 1 0 1

6 : 0 0 0 0 0 1 1 0

7 : 0 0 0 0 0 1 1 1

8 : 0 0 0 0 1 0 0 0

9 : 0 0 0 0 1 0 0 1

10 : 0 0 0 0 1 0 1 0


이런식으로 숫자를 저장할수 있습니다.


각각 공간의 숫자는 위와 같습니다.

8번째 자리에 1이 들어오면 2의 7제곱인 128이 되는겁니다.


short는 2바이트니까

0 0 0 0 0 0 0 0    0 0 0 0 0 0 0 0

이렇게 16비트로 구성됩니다.

2의 16제곱가지 숫자를 표현할수 있죠.


근데 2의 16제곱은 65536입니다. short는 32,767 까지밖에 표현 못하네요?

왜냐하면 -가 있기때문입니다.

음수부분까지 표현하기위해서 반으로 쪼개진거죠.




맨 앞에있는 한자리가 부호를 결정하는 자리입니다.


근데 우리는 프로그래밍을 할때부호가 필요없는상황이 있을수도 있습니다.

만약 집의 넓이를 변수에 담고싶어졌다고 해봅시다.

근데 집의 넓이를 음수까지 표현할필요는 없죠? 집의넓이가 음수라니 말도 안되는일입니다.


그럴떈 unsigned를 앞에 붙여주시면 됩니다.

unsigned short 이런식으로말이죠


unsigned short는 음수부분을 버리고 0 ~ 65535까지 표현할수 있습니다.


그리고 부호를 바꿀때 주의할점이 있습니다.

0 0 0 0 0 0 1 0    이것이 2니까

1 0 0 0 0 0 1 0    맨앞을 1로 바꿔준다고 -2가 되는건 아닙니다

0과 1을 아예 뒤집어주어야합니다. 

1 1 1 1 1 1 0 1 이렇게말이죠

그리고 1을 더해줍니다.

1 1 1 1 1 1 1 0 이렇게 써야 -2가 되는것입니다

음수는 1 1 1 1 1 1 1 1부터 시작해서 작아지는것이죠


근데 여기서 담을수있는 값보다 큰수를 담게되면 어떻게될까요

int형이

01111111 1111111 11111111 11111111

이상태로 담겨있다고 해봅시다

여기서 +1을 해버리면?

1000000 00000000 00000000 00000000

이렇게되버리죠

즉 2147483647에 +1을 했더니 -2147483648가 되는 마법이 일어납니다.


int형에 4294967295를 담든 -1를 담든 똑같이 -1이 되버립니다.


이런식으로 담을수 있는 범위를 초과해서 숫자를 넣어버려서 원하는것과 다른숫자가 들어가는것을 오버플로우 라고합니다


그럼 11111111 1111111 11111111 11111111 이상태에서 +1을 해버리면?

자 상식적으로 생각해봅시다.

-1에서 1을 더했습니다. 당연히 0이 되겠죠?


1 000000 00000000 00000000 00000000

이런 형태가 되고 앞자리의 1은 버려지게 되는겁니다.


0000000 00000000 00000000 00000000

앞자리는 소멸되고 이렇게 0으로 돌아오는거죠.



. 이것은 정수형에서만 해당되는 얘기입니다

실수형은 표현방법이 약간 다르거든요.



근데 만약 정수형타입에 실수형을 넣는다면 어떻게될까요?

int a;

a = 2.5;

라고 입력해봅시다.

하지만 정수형타입에는 실수를 저장할수 없기때문에 뒤에 0.5가 버려지게됩니다.

그래서 a = 2와 똑같이 되버립니다.

반대로 정수를 실수에 넣는것은 딱히 문제가 없습니다.

double a;

a = 5를 할경우 5가 정상적으로 들어갑니다.

근데 연산을할떄는 문제가 생깁니다

double a;

a = 3 / 2

printf("%d",a);

이렇게 할경우 1.5가 출력되야 정상일겁니다.

하지만 결과는 1이 출력됩니다.

정수형으로 적어줬기 때문이죠.

double a;

a = 3.0 / 2.0

printf("%d",a)

이렇게 하면 정상적으로 1.5가 나옵니다.