우리가 프로그램을 만들때에 형변환을 하는 경우도 생기는데, 그에 대해 자세히 알아보자.
#include<iostream>
#include<typeinfo>
int main()
{
using namespace std;
int a = 123;
cout << typeid(a).name() << endl;
return 0;
}
output : int
근데 여기서 좀 의아한 것이 있다. user가 자신 마음대로 자료형을 선언하였는데, 특정 변수의 자료형을 모르는 것에 대해서 말이다.
우선 암시적 형변환에 대해 알아보자. 암시적 형변환은 compiler가 알아서 형변환시키는 것을 말한다.
#include<iostream>
#include<typeinfo>
int main()
{
using namespace std;
int a = 123.2;
cout << typeid(a).name() << endl;
cout << a << endl;
return 0;
}
ouput : int
123
123.2
같은 경우에는 double형이여서 오류가 나야하지만 오류없이 출력되는 것을 볼 수 있다. 따라서 compiler가 자동적으로 판단하여 int형으로 출력하는 것이다.
그럼 명시적 형변환이란 무엇일까? user가 바꿔주는 것을 말한다.
#include<iostream>
#include<typeinfo>
int main()
{
using namespace std;
// numeric conversion
double i = 10000;
char s = i;
// numeric promotion
int a = 10.f;
double d = a;
cout << static_cast<int>(s) << endl;
cout << (int)s << endl;
cout << static_cast<int>(d) << endl;
cout << (int)d << endl;
return 0;
}
output : 16
16
10
10
작은 방에서 큰방으로 값을 옮길때에는 별 문제없이 값이 제대로 출력되는데, 큰방에서 작은방으로 값을 옮기면 문제가 생긴다.
형변환에도 우선순위가 있다. int보다 unsigned int가 우선순위가 높으므로 둘을 계산하면 값은 unsigned int로 계산된다.
형변환 우선순위
int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long -> float -> double -> long double