관련 글
[C언어 강좌] 자료형(정수/실수)의 종류와 크기(sizeof 함수)
C언어 강좌
자료형끼리는 형 변환이 가능합니다.
즉, int형을 double형으로 바꾸고, char형을 int형 등으로 바꿀 수 있다는 소리죠!
형 변환에는 두 가지 종류가 존재합니다.
1. 자동 형 변환
2. 강제 형 변환
자동 형 변환(암시적 형 변환)
데이터 형식(Type)을 자동으로 변환해주는 것을 의미하며,
대입 연산자를 기준으로 오른쪽에서 왼쪽으로 자동 형 변환됩니다.
메모리 크기가 작은 자료형에서 큰 자료형으로 변환되는 것을 우선순위로 둡니다.
크기를 한눈에 비교하면 다음과 같습니다.
char < int < long < float < double < long double
정수형 < 실수형
강제 형 변환(명시적 형 변환)
강제 형 변환은 개발자가 직접 형 변환을 요청하는 것을 의미합니다.
자동으로 형 변환이 일어나는데 굳이 강제적으로 형 변환을 왜 할까요?
이유는, 데이터 손실을 최소화하기 위해서죠.
큰 그릇(큰 자료형)에 담겨 있는 물(데이터)이 작은 그릇(작은 자료형)에 모두 들어간다면 넘치겠죠? 그래서 데이터 손실이 일어나게 됩니다. 데이터 손실은 완전히 막을 순 없습니다.
하지만 강제 형 변환으로 데이터 손실을 최소화할 수 있습니다.
강제 형 변환 시 데이터 손실이 있는 경우와 없는 경우를 비교하여 설명하겠습니다.
데이터 손실이 없는 경우(확장 변환, 프로모션(Promotion))
→ 작은 자료형에서 큰 자료형으로 전환될 경우 데이터 손실이 발생하지 않습니다.
Ex) int → double 손실 X
데이터 손실이 있는 경우(축소 변환, 디모션(Demotion))
→ 큰 자료형에서 작은 자료형으로 전환될 경우 데이터 손실이 발생합니다.
Ex) double → int 손실 O
강제 형 변환 형식
(바꿀 자료형) 변수;
Ex) (double)num;
→ 이처럼 바꿀 자료형을 강제로 () 괄호 안에 기입하게 됩니다.
예를 살펴보겠습니다.
#include <stdio.h> int main(void){ //문자형(작은 자료형) char num1 = 130; //데이터 손실 발생 //int(정수형) int num2 = 3.14; //데이터 손실이 일어남 //실수형(큰 자료형) double num3 = 5; printf("%d\n %d\n %lf\n", num1, num2, num3); return 0; }
아래는 출력 결과입니다.
char num1 = 130;
→ char의 데이터 범위는 -128 ~ +127인데 130으로 초기화했으므로 데이터 손실이 발생합니다.
int num2 = 3.14;
→ 정수형 int는 소수점을 담아내지 못해 데이터 손실이 발생합니다.
double num3 = 5;
→ 실수형 double은 정수형의 메모리 크기보다 크기 때문에 정수 5를 초기화해도 데이터 손실이 발생하지 않습니다.
예를 하나 더 살펴보겠습니다.
#include <stdio.h> int main(void){ //변수 선언 및 초기화 int num1 = 10; int num2 = 3; //변수 선언 및 초기화 double result; result = num1/num2; //result = 10/3; printf("결과1 : %lf\n", result); // 데이터 손실 발생 //강제 형 변환1 result = (double)num1/num2; printf("결과2 : %lf\n", result); //강제 형 변환2 result = (double)num1/(double)num2; printf("결과3 : %lf\n", result); return 0; }
아래는 출력 결과입니다.
int num1 = 10;
int num2 = 3;
→ num1, num2의 변수를 선언하고 초기화합니다.
double result;
result = num1/num2;
→ double형으로 result를 선언하고 초기화(result = 10/3)합니다.
printf("결과1: %lf\n", result);
→ 결과1: 3.000000
→ 결과 값이 3.333333이 나와야 하는데 3.00000이 나옵니다.
→ 정수(num1)와 정수(num2)를 나눈 결과 값이 사실상 실수인데,
초기화 전 여전히 정수형이므로 정수값이 나옵니다.
result = (double)num1/num2;
→ result로 초기화 전 double형으로 강제 형 변환합니다.
→ 데이터 손실을 최소화 하기 위함입니다.
'Code.D IT 강좌 > C언어' 카테고리의 다른 글
[C언어 강좌] 산술 연산자/복합 대입 연산자 (0) | 2017.05.25 |
---|---|
[C언어 강좌] scanf 함수/fflush 함수 (0) | 2017.05.24 |
[C언어 강좌] 자료형(정수/실수)의 종류와 크기(sizeof 함수) (0) | 2017.05.22 |
[C언어 강좌] 변수 선언 및 초기화 (0) | 2017.05.20 |
[C언어 강좌] 특수 문자 (0) | 2017.05.18 |