3.3 형변환    [DOC]    [SMTS]

 산술 연산에서 한 가지 주의할 점은 두 피연산자의 자료형이 다를 경우이다. 이 경우 결과값의 데이터형이 어떤 것이 되느냐가 문제가 될 수도 있다. 먼저, 같은 형끼리의 연산은 결과값도 바로 그 데이터형이 된다.


5/4 // 1 (정수/정수 ➜ 정수)
3/2 // 1 (정수/정수 ➜ 정수)
5.0/4.0 // 1.25 (실수/실수 ➜ 실수)
3.0/2.0 // 1.5 (실수/실수 ➜ 실수)

위 예에서 보듯이 정수형끼리의 나눗셈의 결과도 정수형이 됨에 유의해야한다. 즉, 2/2 는 1.5가 아니라 1이 된다.


 그리고 정수형과 실수형 간 사칙연산 결과는 실수형이 된다는 사실에 유의해야 한다. 즉, 피연산자 중에 하나라도 실수형이라면 결과값도 실수형이 된다.


5.0/4 ➜ 1.25 (실수/정수 ➜ 실수)
2/4.0 ➜ 0.5 (정수/실수 ➜ 실수)

다음 예제에서 이를 확인해 보자


ex03-04.c
#include <stdio.h>
int main()
{
  int ia = 10, ib = 4;
  float fa, fb = 4.0f, fc;
  fa = ia/ib; // (1)
  fc = ia/fb; // (2)
  ib = ia/fb; // (3)
  printf("fa=%f, fc=%f, ib=%d\n", fa, fc, ib);
}

실행 결과

fa=2.000000, fc=2.500000, ib=2

위의 실행 결과에서 변수 fa와 fc값이 왜 다른지 잘 이해해야 한다. (1)에서는 정수/정수이므로 결과값이 먼저 정수형으로 산출된다. 이 값이 실수형으로 형변환되어 실수형 변수 fa에 저장되는 것이다. 그러나 (2)에서는 정수/실수 이므로 결과값이 실수형으로 산출된다. 따라서 정확하게 계산된 값이 실수형 변수 fc에 대입되는 것이다. (3)의 경우는 계산 결과는 실수인데 정수형 변수 ib에 그것을 대입하도록 하였다. 이경우 실수는 정수로 자료형이 변환되며 소수점 이하는 버려진다. 그래서 2.5에서 소수점 이하는 버려진 2 라는 정수값이 ib에 대입되는 것이다.

3.3.1 자동 형변환 (automatic conversion)

 자동 형변환은 이와 같이 산술 연산에서 두 피연산자의 형이 다를 경우 둘 중 더 넓은 자료형으로 다른 하나가 자동으로 변환되는 것을 말한다. 다음에서 오른쪽으로 갈수록 더 넓은 자료형이다.


char < short < int < long < long long < float < double < long double

예를 들어 만약 a + b 에서 a가 long형, b가 double 형이라면 a가 더 넓은 double형으로 자동으로 변환 된 후 덧셈이 수행된다. char형과 long형이라면 둘 다 long형이 된다. 그리고 계산 결과는 항상 넓은 자료형이 된다. 만약 하나는 unsigned 형이고 다른 하나는 signed형이라면 결과를 예측할 수 없으므로 이런 경우는 가급적 피하여야 한다.

3.3.2 명시적인 형변환 (casting)

 사용자가 자료를 명시적으로 형변환해야 할 경우도 있다. 예를 들어서 int형 ia를 long형으로 바꾸고 싶다면 다음과 같이 변수 앞에 (자료형)을 붙여주면 된다.


(long)ia

변수 ia 자체는 변하지 않지만 (long)ia 는 long형 자료가 된다.


int ia=2, ib=4;
float fa = ia/ib;
float fb = (float)ia/ib;

이 예에서 fa 는 0.0 이 fb에는 0.5 가 저장된다. 왜냐면 ia/ib는 둘다 정수이기 때문에 결과값도 정수가 된다. 따라서 소수점 이하가 버려진다. 하지만 (float)ia/ib는 하나는 float형이고 다른 하나는 int 형이므로 ib가 float형으로 자동 형변환 되고 결과값도 float형이 된다. 따라서 정확한 실수값인 0.5가 저장되는 것이다.


 명시적 형변환의 다른 예를 들면 다음과 같다.


(long)(‘a’+2.0f)
fa = (float)((int)ia +1)
da = (double)sa/5

명시적 형변환의 우선 순위는 산술 연산보다 높다는 것도 알아두자.


'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

3.4 관계 연산자  (0) 2015.05.19
3.2 산술 연산자와 부호 연산자  (0) 2015.05.19
C/C++의 연산자 종류  (0) 2015.05.19
C/C++의 goto 명령  (0) 2015.05.19
C/C++의 continue 명령  (0) 2015.05.19
Posted by 살레시오
,