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 (포화)

포화 뺄셈은 게이지·카운터·센서 값처럼 감소 연산에서 경계를 지킬 때 유용해요.

더 알아보기 (Learn more)

cppreference