형변환은 정수형이 실수형이 되거나 혹은 그 반대의 경우가 일어나는 것을 말한다.
이러한 형변환에는 크게 두가지가 있는데 컴파일러에 의해서 자동으로 변환되는 암시적인 형변환이 있고
프로그래머가 형변환 연산자를 이용해서 강제로 처리하는 명시적인 형변환이 있다.

1.암시적인 형변환 (자동 형변환)

일단 예를 들어보자.
'정수 + 실수 = ?' 에서 ?에는 어떤 데이터형이 적합할까?
'10 + 5.5'라고 가정하면 우리는 쉽게 답이 15.5라는 것을 알 수 있다.
그런데 결과값이 만약 정수형 데이터에 저장된다면 15라는 값이 출력될 것이다.

#include <stdio.h>

int main(void)
{
int a=10;
double b=5.5;
int sum=0;

sum = a+b;

printf("%d",sum);

return 0;
}

바로 위와 같은 코드가 그러한 예이다.
실제로 컴파일해보면 알겠지만 당연히 15라는 값이 나온다.

이러한 경우에 일어난 것이 바로 암시적인 형변환이다.
일단 'int + double'을 계산할 때 int형을 double형으로 변환해서 'double + double'로 계산한다.
그러면 결과값도 당연히 double형인데 이것을 int형으로 변환해서 저장하는 것이다. (이 경우 컴파일 경고가 발생한다.)

위의 경우에는 두종류의 암시적인 형변환이 일어난 것인데 먼저 작은 크기(int, 4바이트)의 데이터형을 큰 크기
(double, 8바이트)의 데이터형으로 변환하는 것은 승진(promotion)에 의한 형변환이고 결과값인 15.5를 int형인
sum에 대입하는 것은 대입에 의한 형변환이다.

#include <stdio.h>

int main(void)
{
int a=10;
double b=5.5;

printf("%f",a+b);

return 0;
}

앞서 'int + double'을 계산할 때 int형을 double형으로 변환해서 'double + double'로 계산한다고 했는데 위의 코드가
 그 증거이다. int형인 변수 a를 double형으로 변환해서 계산하여 결과값(15.500000)도 실수형으로 나오게 된다.

2.명시적인 형변환

일단 명시적인 형변환의 형식부터 살펴보자.
형식 : (데이터형) 수식
ex) (int) 3.14

프로그래머가 위와 같은 형식으로 형변환 연산자를 이용해서 직접 형변환을 명시적으로 형변환시킬 수 있다.
왜 명시적인 형변환이 필요할까? 아래의 코드를 보면 프로그래머의 형변환의 결정이 다른 결과를 도출할 수 있다는
것을 알게 될 것이다.

#include <stdio.h>

int main(void)
{
int a=0;
float b=0;

a = (int)(10.6 + 15.7); // 10.6+15.7을 먼저 계산하면 26.3이 되고 이것을 int형으로 변환하면 26이 된다.
printf("a = %d\n",a);

a = (int) 10.2 + (int) 15.3; // 10.2를 int형으로 변환해서 10이 되고 15.3도 마찬가지로 15가 되어 25가 된다.
printf("a = %d\n",a);

b = 10 / 3; // '정수/정수'이므로 몫 역시 정수 값이 된다. 따라서 3이 된다.
printf("b = %f\n",b);

b = (float) 10 / 3; // 하나만 실수형이 되도 암시적인 형변환에 의해서 '실수/실수'로 처리된다.
printf("b = %f\n",b);

b = (float) 10 / (float) 3; // '실수/실수'이므로 실수형의 값을 가진다.
printf("b = %f\n",b);

return 0;
}


'프로그래밍 > C' 카테고리의 다른 글

배열과 포인터의 관계  (0) 2010.10.09
포인터 (Pointer)  (0) 2010.10.09
선택정렬 (Selection Sort)  (0) 2010.10.09
배열 (array)  (0) 2010.10.09
비트 연산자  (0) 2010.10.03
삼각형 출력하기  (0) 2010.10.03
삼항 연산자를 이용한 최대값 구하기  (0) 2010.10.03

+ Recent posts