saturating_cast — std::saturating_cast
saturating_cast — std::saturating_cast (포화 변환)
std::saturating_cast는 값 x를 타입 T로 변환하되, x를 T의 최솟값과 최댓값 사이로 클램프하는 변환이에요. C++26에서 도입됐어요.
오버플로가 되는 변환을 실제로는 타입 범위에 맞게 "포화"시켜요.
출처: cppreference
본문
// <numeric> 헤더, C++26
template< class T, class U >
constexpr T saturating_cast( U x ) noexcept;
x를 타입 T의 값으로 변환하되, x를 T의 최솟값과 최댓값 사이로 클램프해요.
만약 T 또는 U가 부호 있거나 부호 없는 정수 타입이 아니면 프로그램은 잘못된 형태(ill-formed)예요.
#include <cstdint>
#include <numeric>
// 큰 값을 작은 타입으로 변환 → 최댓값으로 포화
std::int8_t a = std::saturating_cast<std::int8_t>(200); // 127 (포화)
std::int8_t b = std::saturating_cast<std::int8_t>(-200); // -128 (포화)
// 범위 내이면 그대로
std::int8_t c = std::saturating_cast<std::int8_t>(100); // 100
특징
- 일반 캐스트와 달리, 범위를 벗어나면 **정의되지 않은 동작이 아니라 포화(saturation)**돼요.
- 부호 있는 ↔ 부호 없는, 크기 축소·확대 모두 안전하게 처리해요.
- constexpr, noexcept — 컴파일 타임 사용 가능.
- 잘린 값 대신 타입 경계값으로 클램프하는 것이 핵심이에요.
// 일반 캐스트: 범위 밖 → UB 또는 미정의 잘림
// signed char c = 300; // 구현 정의
// 포화 캐스트: 안전하게 경계로
signed char c = std::saturating_cast<signed char>(300); // 127
포화 변환은 센서·오디오·이미지 처리처럼 값을 타입 범위로 안전하게 압축해야 할 때 유용해요.