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_* 계열이 제공해요.