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 (포화)
포화 곱셈은 이미지·오디오·센서 처리 등에서 값이 범위를 벗어나지 않게 클램프할 때 유용해요.