saturating_div — std::saturating_div
saturating_div — std::saturating_div (포화 나눗셈)
std::saturating_div는 포화(saturating) 나눗셈을 수행해요. C++26에서 도입됐어요.
나눗셈 결과가 타입 범위를 넘으면 오버플로 대신 최댓값/최솟값으로 고정돼요.
출처: cppreference
본문
// <numeric> 헤더
template< class T >
constexpr T saturating_div( T a, T b ) noexcept;
#include <climits>
#include <numeric>
static_assert(
std::saturating_div<int>(6, 3) == 2 // 포화 없음
&& std::saturating_div<int>(INT_MIN, -1) == INT_MAX // 포화!
&& std::saturating_div<unsigned>(6, 3) == 2 // 포화 없음
);
특징
- 일반 정수 나눗셈에서
INT_MIN / -1은 오버플로로 UB예요.saturating_div는 이를INT_MAX로 포화시켜요. - 0으로 나누는 경우는 여전히 오류 처리 대상이에요 (함수에 따라).
- 부호 있는/부호 없는 타입 모두 지원해요.
- constexpr, noexcept.
int r1 = std::saturating_div<int>(10, 2); // 5
int r2 = std::saturating_div<int>(INT_MIN, -1); // INT_MAX (안전)
포화 나눗셈은 정수 나눗셈의 위험한 오버플로 경계를 안전하게 처리하는 데 유용해요. C++26의 std::saturating_* 계열이 제공해요.