saturating_add — std::saturating_add

saturating_add — std::saturating_add (포화 덧셈)

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

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

출처: cppreference

본문

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

constexpr int a = std::saturating_add(3, 4);   // 포화 없음, T = int
static_assert(a == 7);

// unsigned char 최대값(255)에 4를 더하면 포화 → 255 유지
constexpr unsigned char b =
    std::saturating_add<unsigned char>(UCHAR_MAX, 4);
static_assert(b == UCHAR_MAX);

특징

  • 결과가 T의 표현 범위를 벗어나면, 오버플로 대신 T의 최댓값이나 최솟값으로 **포화(clamp)**돼요.
  • 부호 있는 타입에서는 오버플로(양)이면 T의 최댓값, 언더플로(음)이면 최솟값으로 고정돼요.
  • constexpr, noexcept — 컴파일 타임에도 안전하게 사용 가능.
  • 안전한 연산(critical software)에서 정수 오버플로 UB를 방지해요.
int x = std::saturating_add(INT_MAX, 1);
// INT_MAX (오버플로 대신 포화)

int y = std::saturating_add(INT_MIN, -1);
// INT_MIN (언더플로 대신 포화)

포화 산술은 이미지 처리, 오디오 처리, 센서 데이터 등에서 값이 범위를 벗어나지 않게 클램프할 때 유용해요. C++26의 std::saturating_* 계열이 제공해요.

더 알아보기 (Learn more)

cppreference