numeric_saturating_cast

numeric_saturating_cast (포화 변환)

std::saturating_cast는 값 x를 타입 T의 값으로 변환하면서 T의 최솟값과 최댓값 사이로 x를 고정(clamping)하는 함수예요. C++26부터 사용할 수 있어요.

출처: cppreference

본문

<numeric> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.

template< class T, class U >
constexpr T saturating_cast( U x ) noexcept;

(since C++26)

값 x를 타입 T의 값으로 변환해요. x를 T 타입의 최솟값과 최댓값 사이로 고정해요.

T 또는 U가 부호 또는 무부호 정수 타입(표준 정수 타입과 확장 정수 타입 포함)이 아니면 프로그램은 ill-formed예요.

매개변수 (Parameters)

  • x — 정수 값

반환값 (Return value)

  • x를 T 타입의 값으로 표현할 수 있으면 x. 그 외에는,
  • x의 값에 더 가까운 T 타입의 가장 큰 또는 가장 작은 표현 가능한 값.

참고 (Notes)

피처 테스트 매크로 표준 기능
__cpp_lib_saturation_arithmetic 202311L (C++26) 포화 산술
202603L (C++26) 포화 산술 함수 이름 변경

가능한 구현 (Possible implementation)

libstdc++ (GCC), libc++ (Clang) 참고.

예제 (Example)

이 코드를 실행해 봐요.

#include <cstdint>
#include <limits>
#include <numeric>

int main()
{
    constexpr std::int16_t x1{696};

    constexpr std::int8_t x2 = std::saturating_cast<std::int8_t>(x1);
    static_assert(x2 == std::numeric_limits<std::int8_t>::max());

    constexpr std::uint8_t x3 = std::saturating_cast<std::uint8_t>(x1);
    static_assert(x3 == std::numeric_limits<std::uint8_t>::max());

    constexpr std::int16_t y1{-696};

    constexpr std::int8_t y2 = std::saturating_cast<std::int8_t>(y1);
    static_assert(y2 == std::numeric_limits<std::int8_t>::min());

    constexpr std::uint8_t y3 = std::saturating_cast<std::uint8_t>(y1);
    static_assert(y3 == 0);
}

더 알아보기 (Learn more)

cppreference