다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행되며
이를 형 변환이라고 한다.
char ch = 1544;
int i = 1.1f;
형 변환 과정에서는 데이터의 손실이 발생할 수 있으며 이를 축소변환(demotion)이라고 한다.
축소변환이 일어나는지 확인을 하려면
중괄호를 이용해 컴파일이 되는지 확인을 한다.
int i = { 1.1f };
정수의 형변환은 기본적으로 int로 형변환이 된다.
산술 연산과정에서는 더 큰 자료형으로 형변환이 일어난다.
ex) short + int = int
같은 타입과 unsigend의 연산은 unsigned로 형변환
ex) unsigned int + int = int
#include <iostream>
using namespace std;
int main() {
unsigned short s0 = 40000;
// unsigned short의 최대 값 = 65535
unsigned int i0 = 4100000000;
// unsigned int의 최대 값은 = 4,294,967,295
long long ll0 = i0;
unsigned int i1 = -110;
int i2 = 10;
cout << s0 + s0 << endl;
cout << typeid(s0 + s0).name() << endl;
cout << endl;
cout << i0 + i0 << endl;
cout << typeid(i0 + i0).name() << endl;
cout << endl;
cout << i0 + ll0 << endl;
cout << typeid(i0 + ll0).name() << endl;
cout << endl;
cout << i1 + i2 << endl;
cout << typeid(i1 + i2).name() << endl;
// underflow 발생
}
80000
int
3905032704
unsigned int
8200000000
__int64
4294967196
unsigned int
사이즈가 더 큰 자료형으로 형변환이 이뤄진다.
ex) long double + double = long double
float + double = double
실수 + 정수 = 실수
float f = 1.f;
unsigned long long ull = 10ULL;
cout << typeid(f + ull).name() << endl;
float
변환 규칙
char형 → short형 → int형 → long형 → float형 → double형 → long double형
#include <iostream>
using namespace std;
class Test {
public:
explicit operator bool() const {
return true;
}
};
int main() {
Test t;
!t;
t && true;
cout << false || t;
}
t가 boolean 형으로 바뀌었다.