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

+ Recent posts