[C언어 강좌] #7-2 자료형(Data Type)


실수형

실수형 크기 범위
float 4바이트 32비트 1.175494e-038 ~3.402823e+038
double 8바이트 64비트 2.225074e-308 ~1.797693e+308
long double 8바이트 64비트 2.225074e-308~1.797693e+308

실수형 데이터를 저장하는 변수의 자료형은 실수형입니다.

실수형의 종류에는 float, double, long double 등이 있습니다.

 

정수형과 마찬가지로 실수형도 최대, 최솟값을 구하는 시스템 라이브러리가 있습니다.

전처리기에서 <float.h>를 include 해주세요.

 

#include <stdio.h>
#include <float.h>

int main(void){
	printf("float의 최소값 : %e, 최대값 : %e \n", FLT_MIN, FLT_MAX);
	printf("double의 최소값 : %e, 최대값 : %e \n", DBL_MIN, DBL_MAX);
	printf("long double의 최소값 : %Le, 최대값 : %e \n", LDBL_MIN, LDBL_MAX);
	
	return 0;
}

float의 최소값 : 1.175494e-038, 최대값 : 3.402823e+038
double의 최소값 : 2.225074e-308, 최대값 : 1.797693e+308
long double의 최소값 : 2.225074e-308, 최대값 : 1.797693e+308

--------------------------------
Process exited after 0.02166 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

매우 큰 실수 형태의 값은 앞에서 배운 %e (지수 표기법)로 출력하면 알아보기 쉽게 출력할 수 있습니다.

float와 double을 출력할 때는 %f를 사용하고 long double 출력 시에는 %Le를 사용합니다.

 

#include <stdio.h>
#include <float.h>

int main(void){
	float n1 = 5.6e+20;
	double n2 = 5.6e+20;
	
	printf("%f, %f, %e", n1, n2, n1);
	return 0;
}

559999990112268060000.000000, 560000000000000000000.000000, 5.600000e+020
--------------------------------
Process exited after 0.02068 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

컴퓨터가 실수를 표현하는 방식에는 부동 소수점고정 소수점 두 가지 방식이 있습니다.

이 둘을 간단하게 설명하자면 부동 소수점은 소수점 이상, 소수점 이하를 특정 비트로 할당해서 표현하는 방식입니다.

이 방식은 큰 수를 표현 시 문제가 발생하기 때문에 보통 부동 소수점을 사용합니다.

 

부동 소수점은 뜰 부(浮) 자를 사용해서 말 그대로 소수점이 고정되어 있지 않고 소수점이 움직이는 형태입니다.

하지만 이 방식 역시 완전히 정밀하지 않고 오차는 발생합니다.

(컴퓨터의 구조적 문제라 어쩔 수 없습니다)

 

우리가 지금 배우고 있는 실수 자료형 float, double은  부동 소수점 방식을 이용합니다.

그런데 서식 문자 %f는 고정 소수점 방식을 이용합니다. %e는 부동 소수점 방식입니다.

 

위의 예제를 보면 float와 double 형을 % f를 통하여 출력 중인데요 

float는 오차가 발생하지만 double은 오차가 발생하지 않는 걸 알 수 있습니다.

이것은 double 형태가 float보다 표현 범위가 넓어서 그렇습니다. 물론 double의 표현 범위를 넘어서면

double 또한 오차가 발생합니다. 

 

 

 

*double을 %lf 로 출력하지 않는 이유가 궁금하시면

https://pgh268400.tistory.com/13?category=1072473

이 강의를 참고해주세요 ^^

 

접미어

상수 뒤에 특정 키워드를 붙이면 그 상수의 자료형을 지정할 수 있습니다.

ex) float n1 = 0.123456789L

 

자료형 접미어
unsinged int U 또는 u
Long (실수형에서 long double) L 또는 l
unsinged long UL 또는 ul
float F 또는 f
double x(생략시 - 실수형에서)

두 숫자를 연산할 때 오류가 발생 시 이 접미어를 통해 한쪽의 자료형을 명시해줌으로써 오류를 제거할 수 있습니다.

 

문자형

컴퓨터는 0(꺼짐)과 1(켜짐)을 이용한 이진법을 이용합니다.

그렇기 때문에 사람들이 사용하는 문자를 이해하지 못합니다.

그러면 생각을 조금 바꿔서 문자를 숫자에 대응시키면 알아들을 수 있을 것입니다.

 

이러한 규칙을 만들기 위해 ANSI(미국 표준 협회)에서 ASCII 란 코드를 만들어서 숫자를 이용하여 문자를

인식하게 하였습니다. 물론 한글, 한자와 같은 문자들은 ASCII 코드에 1:1로 대응시켜서 다 담을 수 없기 때문에

Unicode 란 방식을 사용합니다.

 

ASCII 코드는 0~127까지 의 숫자가 문자에 대응되어 있습니다. 이 범위를 보면 생각나는 게 있으신가요?

저번 정수형을 자세히 보신 분들이 라면 알겠지만 바로 char형입니다. char은-128~127까지의 범위를 표현할 수

있으므로 정수를 저장하는 것보단 문자를 저장하는데 많이 사용하게 됩니다.

 

#include <stdio.h>

int main(void){
	printf("%d", sizeof(char));
	return 0;
}

1
--------------------------------
Process exited after 0.02136 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

char은 1바이트입니다. 이 중에서 7비트는 아스키코드 표현, 나머지 1비트는 오류 검출에 사용됩니다.

한글은 2바이트로 표현하기 때문에 char형에 바로 담을 순 없습니다.

C#과 같은 언어에선 unicode를 사용하기 때문에 char형이 2바이트입니다.

 

int main(){
	char val;
	printf("문자를 입력해주세요 : ");
	scanf("%c", &val);
	printf("%c에 대응되는 ASCII 코드는 %d 입니다.", val, val);
	
	return 0;
}

문자를 입력해주세요 : C
C에 대응되는 ASCII 코드는 67 입니다.
--------------------------------
Process exited after 0.6544 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

다음 예제는 문자 하나를 입력받고 ASCII 코드를 출력하는 예제입니다.

char은  문자 하나를 저장할 때 쓰는 자료형이기 때문에 char v1 = "Hello"와 같이 큰 따옴표를 사용해

여러 문자를 출력한다던가, 한글을 저장하면 오류가 발생합니다.

 

자료형 변환

#include <stdio.h>
int main(){
	int n1 = 100;
	int n2 = 3.0;
	
	double result = n1 / n2;
	printf("Result : %lf", result);
	return 0;
}

Result : 33.000000
--------------------------------
Process exited after 0.3244 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

다음 소스코드는 100/3 을 계산하는 소스코드입니다.

100을 3으로 나누면 33.3333.. 이 되겠죠. 그런데 double 형의 result 값에 정수 값 두 개를 나눠서 저장하기 때문에

뒤 소수점이 사라져 데이터 손실이 발생합니다.

 

이를 해결하기 위해 프로그래머가 자료형을 변환해줘야 합니다.

 

#include <stdio.h>
int main(){
	int n1 = 100;
	int n2 = 3.0;
	
	double result = double(n1) / n2;
	printf("Result : %lf", result);
	return 0;
}

Result : 33.333333
--------------------------------
Process exited after 0.3234 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

자료형 변환은 생각보다 간단합니다. 그냥 바꿀 자료형 이름으로 변수를 괄호로 감싸주면 됩니다.

위의 경우엔 int변수 n1을 double로 강제 형변환 했는데, 이렇게 바꾸게 되면 n2도 자동으로 double로 자동형 변환이 이루어져 계산이 되게 됩니다.

 

double 값 소수점 6자리까지 잘 출력되는 모습입니다.

 

Typedef 로 자료형 재정의 하기

#include <stdio.h>
typedef char Bugger;
int main(){
	Bugger first[10] = "BIG_MAK";
	printf(first);
}

Typedef 자료형 이름 으로 사용자 지정 자료형을 만들 수 있습니다.

위 예제는 char의 자료형의 명칭을 Bugger로 바꾸고 아직 배우진 않았지만 문자열 배열을 만들어서 "BIG_MAK" 문자열을 넣은 예제입니다.

 

COMMENT WRITE