'아무거나 컴퓨터/프로그래밍언어'에 해당되는 글 4건

변수파트에서본 소스을 다시 보겠씁니다.

1#include<stdio.h>

2

3int main(void)

4{

5 int num;//num이라는 변수을 선언

6 num = 0;//0으로 대입

7 int val = 0;//val이라는 변수을 0으로 초기화

~~

 

변수파트에서 num 이 정수형태 가진 변수라고 했습니다. 그럼 어떻게 해서 "정수"라고 정의 했을까요?

"num"앞에 있던것 "int" 키워드 때문입니다. "int" 는 정수라고 뜻하는  integer의 약자입니다.

이런 키워드을 기본 데이터 타입혹은 자료형이라고 합니다.

기본 데이터 타입은 변수 앞에 사용하며 변수의 저장정보및 표현방식을 의미할때 사용합니다.

즉 "num은 정수형 데이터 타입 변수이다." 라는것을 알려주기위한 것입니다.


기본데이터 타입을 두가지 기준으로 나눕니다.

하나는 테이터을 표현하는 방식 즉 실수냐 정수냐라는 차이의 기준으로 또하나는 데이터의 크기에따라서  

나누는 방식으로 나눕니다.

보통적으로는 데이터가 실수냐 정수냐 따라서 표현방식을 나누고 있습니다,


기본 데이터 타입 - 정수형

말그대로 변수을 정수형태로 저장정보및 표현방식 지정한다고 선언할때 사용합니다.

종류는 아래와 같이 5개 정도있습니다.

정수형 데이터 타입

크기

값의 표현범위

char

8bit(1byte)

-128 이상 +127이하

short

16bit(2byte)

-32,768 이상 +32,767이하

int

32bit(4byte)

-2,147,483,648 이상 +2,147,483,647 이하

long

32bit(4byte)

-2,147,483,648 이상 +2,147,483,647 이하

long long

64bit(8byte)

-9,223,372,036,854,775,808이상

+9,223,372,036,854,775,807이하


가장많이사용하는 형태은 문자형을  char과 정수형을 int을 주로 많이 사용합니다.

사실 문자형이 정수형에 들어가는 이유는 아스키코드값이 정수 형태라서 정수범위에 들어갑니다.

그리고 참고 사양이지만 short와 long,long long 뒤에 int가 모두 생략 되어습니다.


데이터가 표현 범위을 넘었경우 경우....

그럴경우 예제을 통해서 알아 보겠습니다. 


 #include<stdio.h>


int main(void)

{

int n1 = +2147483647;// int형 변수의 최대 값

int n2 = -2147483648;// int형 변수의 최소 값


printf("오버플로우 발생 전 : %d\n ",n1);

n1 = n1+100;//overflow

printf("오버플로우 발생 후 : %d \n",n1); 


printf("언더플로우 발생 전 : %d \n",n2);

n2 = n2-100;//underflow

printf("언더플로우 발생 후 : %d \n",n2); 


return 0;
}


int 형의 저장범위는 -2,147,483,648 이상 +2,147,483,647 이하 입니다.

하지만 그이상 넘으면 오버플로우(overflow), 그 이하로 넘어가면 언더플로우(underflow)

발생된다는 겁니다. 그렇게되면 부호도 바뀌고 숫자도 바뀌는등 엉뚱한 쓰레기값이 출력됩니다.

그럼 어떻게 해결하는가?

그럴경우 데이터타입을 바꾸어 주면 됩니다.


 #include <stdio.h>


int main(void)

{

//int n1 = +2147483647;// int형 변수의 최대 값

//int n2 = -2147483648;// int형 변수의 최소 값

long long n1 = +2147483647; 

long long n2 = -2147483648;


printf("오버플로우 발생 전 : %lld \n",n1);

//데이터형이 long long이면 서식문자 %lld

n1 = n1+100;//overflow

printf("오버플로우 발생 후 : %lld \n",n1); 


printf("언더플로우 발생 전 : %lld \n",n2);

//데이터형이 long이면 서식문자 %ld

n2 = n2-100;//underflow

printf("언더플로우 발생 후 : %lld \n",n2);

//visual studio계열 경우는 return문은 생략해도 상관 없음.

}


int형보다 더 큰 long나 long long 형으로 바꾸어 주면 되지만 

만약의 부득이 한경우라면...


 #include <stdio.h>


int main(void)

{

int n1 = +2147483647;// int형 변수의 최대 값

int n2 = -2147483648;// int형 변수의 최소 값


printf("오버플로우 발생 전 : %lld \n",(long long)n1);

n1 = n1+100;//overflow

printf("오버플로우 발생 후 : %lld \n",(long long)n1); 


printf("언더플로우 발생 전 : %lld \n",(long long)n2);

n2 = n2-100;//underflow

printf("언더플로우 발생 후 : %lld \n",((long long)n2);  

}


이렇게 변수앞에 자료형을 적어주면 됩니다. 이걸을 형변환이라고 합니다.

하지만 일부 컴파일러는 long나 long long이라는 자원하지 않는 경우가 있다. 특히

비주얼스튜디오c++6.0포함 이하 컴파일러는 지원 하지 않는 경우가 있습니다. 그래서 저런 경우 long나 long long

로 해결이 되지않는 경우가 있습니다. 그럴경우 어떻게 해야 해야할까요? 

그럴 경우 데이터타입앞에 unsigned을 붙어서 해결해주면 됩니다. 


unsigned

unsigned는 뜻그대로 무부호(無符號)라는 뜻으로 즉, 부호가 없다는 의미을 가지고있습니다.

그러니 부호가 있는 음의 정수을 표현하던 범위 만큼  양의 정수에 추가로 표현하여 이론상으로는 

2배로 값의표현 범위가 늘어나게 됩니다.


정수형 데이터 타입

크기

값의 표현범위

unsigned char

8bit(1byte)

0 이상 +255이하

unsigned short

16bit(2byte)

0 이상 +65,535이하

unsigned int


32bit(4byte)

0 이상 +4,294,967,295 이하

unsigned long

32bit(4byte)

0 이상 +4,294,967,295 이하

unsigned long long

64bit(8byte)

0 이상

+18,446,744,073,709,551,615이하


참고사항이지만 기본적인  5개의 데이터타입앞에 signed가 생략되어 있습니다.

signed의 뜻은 부호있다는 뜻으로서 데이터타입앞에 signed써도 아무일도 일어나지 않습니다.

만약 unsigned을 같이 쓰는경우라면 구분이 쉽게 하기 위해 쓰는것을 권장합니다.


기본 데이터 타입 - 실수형

역시 소수점 이하일때 저장정보및 표현방식 지정한다고 선언할때 사용 합니다.


실수형 데이터타입

값의 표현범위

소수점 이하 정밀도

byte크기

float

10e-37 이상 10e38

6자리

4byte

double

10e-307이상10e308

15자리

8byte

long double

10e-4931이상10e4932

18자리

18byte


보통은 float보단 double이라는 데이터타입을 주로 사용합니다. 하다보면 꼬이고 귀찮으니간 또한 float가 할수있는 범위도 double으로 가능하니간 언간한책에서는 실수형쓸때 double로 걍쓰라고합니다. 

또한 소수점을 사용하기 때문에 부호뜻하는 signed나 unsigned는 실수형 데이터타입 앞에는 붙이지 않습니다. 


자료형 선택하기

자료형의 선택기준은 자료의 크기냐 정확성의 차이입니다.

보통 정수형은 바이트의 크기의 중점에 두고있는것과 실수형은 정밀도에 중점에 두고있다는 것입니다.

그래서 먼저 자료 즉 변수의 크기을 기준할경우 정수형 자료형으로 선택합니다. 그리고 간단 한 수식 계산 할때나 문자로 표현할 경우에도 정수형 자료형을 선택합니다.

반면 실수형은 정밀도입니다. 수학적인 계산이나 정밀한 수치 요할시 실수을 사용합니다.

블로그 이미지

Airu

안녕하세요

,