Cute Blue Flying Butterfly
본문 바로가기
CS

C++ : narrowing conversion(축소 변환)

by jordancancode 2025. 9. 6.

Narrowing Conversion?

 

더 큰 범위나 정밀도를 가진 타입의 값을 더 작은 범위나 정밀도를 가진 타입으로 바꾸는 것을 말한다.

 

예를 들면, float 값에 해당하는 3.141592...를 int형으로 형변환하면 소수점을 손실한다. 이를 축소 변환이라고 한다.


반대로, 확장 변환도 있다. Widening Conversion은 작은 정밀도를 가진 타입의 값을 큰 타입으로 바꾸는 것이다.

 

Risk?

 

1. 데이터 손실 위험

- 값이 표현 범위를 초과하면 잘리거나 오버플로우가 발생한다.

- 소수점이 버려지거나 근사치로 변환된다

2. 안전하지 않은 변환

- widening conversion(확장 변환)과 달리 비트를 잘라버리는 것과 같아서 안전치 않다 

 

C++ 버전에 따른 리스크 대응

 

 C++08까지는 모든 변환이 암묵적으로 허용되었기 때문에, Human Error가 많았다. 이에 대한 대책은 애초에 코드를 짤 때 안전하게 짜거나, 캐스트 사용 수준이 전부였다.

 

 C++11 이후 버전에서는 컴파일 에러를 통해 해당 상황을 막고 있다.

특히, llist-initialization 규칙에 narrowing conversion을 금지하는 기능이 추가되었다.

따라서, MISRA C++ 2023이나 AUTOSAR C++ 14 같은 가이드라인을 준수해야 하는 경우에는 해당 법칙에 따라 초기화를 하는 것이 합당하다고 할 수 있다.

int x{3.14};	// error
int y = 3/14;	// 경고만 나오거나, 묵시적으로 변환한다.

 

반응형