saturating_cast — std::saturating_cast

saturating_cast — std::saturating_cast (포화 변환)

std::saturating_cast는 값 x를 타입 T로 변환하되, xT의 최솟값과 최댓값 사이로 클램프하는 변환이에요. C++26에서 도입됐어요.

오버플로가 되는 변환을 실제로는 타입 범위에 맞게 "포화"시켜요.

출처: cppreference

본문

// <numeric> 헤더, C++26
template< class T, class U >
constexpr T saturating_cast( U x ) noexcept;

x를 타입 T의 값으로 변환하되, xT의 최솟값과 최댓값 사이로 클램프해요.

만약 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

포화 변환은 센서·오디오·이미지 처리처럼 값을 타입 범위로 안전하게 압축해야 할 때 유용해요.

더 알아보기 (Learn more)

cppreference