MSVC 2019로 여러가지 형변환을 해보았다. RTTI 형식 정보사용은 on을 해두었다.
Implicit Type Conversion (암시적 형 변환)
(예시1)
unsigned short a = 2;
int b = a;
// a - b = 0
그러나, 다음과 같은 상황에서는 값이 잘릴 수 있다.
(예시2)
int a = 925;
unsigned char b = a; // max 값이 255인 unsigned char에 925를 대입해보자.
// a - b = 768 의도하지 않은 값이 나온다.
(예시3)
double a = 0.123456789123456789; // 배정도(double-precision)의 double를,
float b = a; // 단정도(single-precision)의 float에 대입.
// a - b = -1.91982e-09
Explicit Type Converion (명시적 형 변환)
1. cast (C)
C언어에서 사용하는 강제 형변환 방식
수식을 잠시 원하는 형으로 변환시켜준다 (단, 자체는 변하지 않음).
문법 : (형 이름) 수식
(예시4)
float a = 1 / 3; // a = 0
float a = (float) 1 / 3 // a = 0.33333
float a = 1 / (float) 3 // a = 0.33333
float a = (float) 1 / (float) 3 // a = 0.33333
2. static_cast (C++)
C++에서 컴파일타임에 수행되는 형변환 방식
C 방식의 casting과 차이라면, 컴파일 타임에 타입 검사를 해준다.
문법 : static_cast<형 이름>(수식)
주로 numeric value를 변환시킬때 사용한다.
(예시5)
float a = static_cast<float>(1) / 3; // a = 0.33333
포인터 변수 형 변환에 사용될수 있지만, 컴파일 타임에만 타입을 체크하고 런타임에는 하지 않기 때문에 Microsoft에서는 이것을 추천 하지 않는다고 명시해두었다.예를 들어, static_cast로 다운캐스팅을 강제하여 사용하면 문제가 생길 수 있다.
(예시6)
parent* p = new parent();
child* c = static_cast<child*>(p); // Down Casting. Not Safe 런타임때 에러가 안 걸린다.
그러므로 잘못된 값을 그대로 쓰게 된다.
3. dynamic_cast (C++)
(예시7)
C++에서 런타임에 수행되는 형변환 방식
문법 : dynamic_cast<형 이름>(수식)
numeric value를 변환시킬 수 없다.
(예시7)
float a = static_cast<float>(1) / 3; // 컴파일 에러
안정성 때문에 포인터 변수 형 변환에 staitc_cast 대신 사용된다.
(예시8)
parent* p = new parent();
child* c = static_cast<child*>(p); // Down Casting. Not Safe 런타임때 에러가 걸린다.
4. reinterpret_cast (C++)
2의 static_cast와 3의 dynamic_cast가 같은 (자료형 <-> 다른 자료형), (포인터 <-> 포인터) 끼리만 해주었다면,
reinterpret_cast는 숫자 -> 주소값으로도 가능하다.
<The C++ Programming Language>에 수록된 예제를 살펴보면,
IO_device *d1 = reinterpret_cast<IO_device*>(0xff00); // 저런식으로 raw memory 접근을 시도한다.
컴파일러는 당연히 컴파일될때 0xff00의 값이 타당한지 체크를 하지않는다. 따라서 reinterpret_cast 매우 위험한 캐스팅이다. 스트롭스트룹는 이 형변환을 "for changing the meaning of bit patterns"라고 정의하였다.
5. const_cast (C++)
const로 선언된 변수에 접근하여 값을 수정할 권한이 생기는 형변환이다.
10에서 9로 바뀌었다.
참고
Brian Kernighan & Dennis Ritchie, <The C Programming Language> 2nd edition
Bjarne Stroustrup, <The C++ Programming Language> 4th edition
docs.microsoft.com