C 언어 자료형 형변환 사용 방법

자료형 변환이란 char형을 int로 바꾸거나 int를 double로 바꾸는 식으로 자료형 타입을 바꾸는 것을 말합니다.

형변환에는 두 가지 종류가 있습니다. 

자동 형변환과 강제 형변환입니다.

자동 형변환은 자동으로 발생하는 것이고 강제 형변환은 코드에서 직접 형변환을 해줘서 강제로 변환이 일어나는 겁니다.

 

자동 형변환

자동 형변환 예제를 보겠습니다.

#include <stdio.h>
int main(void) {

    double num = 100;    	
    printf("%f", num);
    // 100.000000
    
	return 0;
}

 

결과

100.000000

 

위 예제는 자동 형변환이 일어났습니다.

실수형인 double형에 int형 정수인 100이 대입되려 할 때 자동으로 상수 100은 형변환이 일어납니다.

상수가 자동으로 double형으로 변환되어서 100.000000으로 변환돼서 대입됩니다.


이런 식으로 정수형을 실수형으로 바꿀 때는 단순히 뒤에 소수점이 붙는 것으로 실수형으로 바뀔 수 있습니다.

하지만 실수형을 정수형에 넣으려 할 때는 주의가 필요합니다.

#include <stdio.h>
int main(void) {

    int num = 123.567;    	
    printf("%d", num);
    // 123
    
    return 0;
}

 

결과

123

 

정수형 변수에 실수형 데이터를 대입하면 소수점 부분이 버려집니다.


이번에는 char형 변수에 int형 변수를 대입해보겠습니다.

#include <stdio.h>
int main(void) {

    int num = 129;   
    char ch = num;
    printf("%d", ch);
    // -127
    
    return 0;
}

 

결과

-127

 

이 경우는 상위 바이트의 손실이 일어나서 10000001만 남게 됩니다.

맨 앞자리는 부호를 결정하는 곳이기 때문에 -127로 바뀌었습니다.



자동 형변환은 이런 식으로 자료형의 불일치로 일어납니다. 

하지만 이것은 대입에서만 일어나지 않습니다.

연산을 할 때 두 개의 피연산자가 필요한 경우가 있습니다. 

근데 그 둘의 자료형이 일치하지 않는다면 그때도 형변환이 일어납니다.

#include <stdio.h>
int main(void) {

    double num = 10.5 + 5;   
    printf("%f", num);
    // 15.500000
    
    return 0;
}

 

결과

15.500000

 

이런 경우에는 정수형과 실수형이 있기 때문에 한쪽을 형변환 해줘야 합니다.

만약 10.5를 정수로 바꾸려 하면 데이터의 손실이 일어나서 정확한 계산이 되지 않을 것입니다.

그래서 이럴 때는 형변환이 데이터의 손실이 적은 방향으로 변환을 합니다.



그 우선순위는 아래와 같습니다.

long double – double – float – long long – long – int



하지만 주의할 점이 있습니다.
float보다 long long이 바이트 크기가 더 큽니다. 

하지만 어째서인지 float의 우선순위가 더 높은걸 볼 수 있습니다.

long long은 정수형이기 때문에 단순히 바이트 크기가 크다고 이쪽으로 변환하려 하면 소수점이 버려지게 됩니다.

그렇게 되면 손실이 더 크게 일어날 수 있기 때문에 바이트 크기에 상관없이 실수형이 무조건 우선순위가 더 높습니다.

 

 

강제 형변환

이번에는 직접 변경해주는 강제 형변환에 대해서 알아보겠습니다.

#include <stdio.h>
int main(void) {

    int num1 = 10;
    int num2 = 4;
   
    double dnum = num1 / num2;
   
    printf("%f", dnum);
    //2.000000
    
    return 0;
}

 

결과

2.000000

 

위 예제의 경우 10에서 4를 나눴는데 2가 나오는 이상한 현상이 발생했습니다.

이것은 두 피연산자가 모두 int형으로 일치해서 형변환이 일어나지 않고 나눗샘했을 때 소수점 자리가 버려져서 생긴 일입니다.

10과 4를 나눠서 2.5가 됐지만 두 피연산자는 정수형이었기 때문에 연산 결과도 정수형으로 바뀌어서 2로 변환되고  그게 실수형 변수에 대입되면서 다시 실수로 바뀌어서 2.0이 출력됐습니다.

이런 문제를 해결하려면 강제로 형변환을 해주면 됩니다.

#include <stdio.h>
int main(void) {

    int num1 = 10;
    int num2 = 4;
   
    double dnum = (double)num1 / num2;
   
    printf("%f", dnum);
    //2.500000
    
    return 0;
}

 

결과

2.500000

 

원하는 타입으로 변환을 하고 싶은 경우에는 (자료형의 이름)을 넣어주면 그 자료형으로 강제로 형 변환이 진행됩니다.

num1이 실수형으로 바뀌어서 연산할 때 피연산자의 자료형 불일치로 인해서 위에서 설명했던 자동 형변환이 일어납니다.

결과 num1과 num2는 둘 다 실수형으로 바뀌어서 계산되고 2.5가 정상적으로 출력됩니다.

댓글