saturating_sub — std::saturating_sub
saturating_sub — std::saturating_sub (포화 뺄셈)
std::saturating_sub는 포화(saturating) 뺄셈을 수행해요. C++26에서 도입됐어요.
뺄셈 결과가 타입 범위를 넘으면 오버플로(언더플로) 대신 최댓값/최솟값으로 고정돼요.
출처: cppreference
본문
// <numeric> 헤더
template< class T >
constexpr T saturating_sub( T a, T b ) noexcept;
#include <climits>
#include <numeric>
static_assert(
std::saturating_sub<int>(INT_MIN + 4, 3) == INT_MIN + 1 // 포화 없음
&& std::saturating_sub<int>(INT_MIN + 4, 5) == INT_MIN // 언더플로 포화
&& std::saturating_sub<int>(INT_MAX - 4, -3) == INT_MAX - 1 // 포화 없음
&& std::saturating_sub<int>(INT_MAX - 4, -5) == INT_MAX // 오버플로 포화
);
특징
- 결과가 범위를 벗어나면 오버플로/언더플로 대신
T의 최댓값/최솟값으로 **포화(clamp)**돼요. - constexpr, noexcept — 컴파일 타임 사용 가능.
- 정수 뺄셈 오버플로 UB를 방지해요.
int a = std::saturating_sub<int>(10, 3); // 7
int b = std::saturating_sub<int>(INT_MIN, 1); // INT_MIN (포화)
int c = std::saturating_sub<int>(INT_MAX, -1); // INT_MAX (포화)
포화 뺄셈은 게이지·카운터·센서 값처럼 감소 연산에서 경계를 지킬 때 유용해요.