saturating_mul — std::saturating_mul

saturating_mul — std::saturating_mul (포화 곱셈)

std::saturating_mul포화(saturating) 곱셈을 수행해요. C++26에서 도입됐어요.

곱셈 결과가 타입 범위를 넘으면 오버플로 대신 최댓값/최솟값으로 고정돼요.

출처: cppreference

본문

// <numeric> 헤더
template< class T >
constexpr T saturating_mul( T a, T b ) noexcept;
#include <climits>
#include <numeric>

static_assert(
    std::saturating_mul<int>(2, 3) == 6             // 포화 없음
    && std::saturating_mul<int>(INT_MAX / 2, 3) == INT_MAX  // 포화!
    && std::saturating_mul<int>(-2, 3) == -6             // 포화 없음
    && std::saturating_mul<int>(INT_MIN / -2, -3) == INT_MIN  // 포화
    && std::saturating_mul<unsigned>(2, 3) == 6
);

특징

  • 결과가 범위를 벗어나면 오버플로 대신 T의 최댓값/최솟값으로 **포화(clamp)**돼요.
  • 부호 있는 타입에서 양수 오버플로 → INT_MAX, 음수 언더플로 → INT_MIN.
  • constexpr, noexcept — 컴파일 타임 사용 가능.
  • 정수 곱셈 오버플로 UB를 방지해요.
int a = std::saturating_mul<int>(1000, 1000);   // 범위 내면 1000000
int b = std::saturating_mul<int>(INT_MAX, 2);   // INT_MAX (포화)

포화 곱셈은 이미지·오디오·센서 처리 등에서 값이 범위를 벗어나지 않게 클램프할 때 유용해요.

더 알아보기 (Learn more)

cppreference