std::saturating_add - cppreference.com

From cppreference.com

template<classT>constexprTsaturating_add(Tx,Ty)noexcept;(since C++26)Computes the

saturating

addition x+y. This operation (unlike built-in

arithmetic operations on integers

) behaves as-if it is a mathematical operation with an infinite range. Let q denote the result of such operation. Returns:

q, if q is representable as a value of type T. Otherwise,

the largest or smallest value of type T, whichever is closer to the q.

This overload participates in overload resolution only if T is an

integer type

, that is: signedchar, short, int, long, longlong, an extended signed integer type, or an unsigned version of such types. In particular, T must not be (possibly cv-qualified) bool, char, wchar_t, char8_t, char16_t, and char32_t, as these types are not intended for arithmetic.

Parameters

x, y - integer values Return value

Saturated x+y.

Notes

Unlike the built-in arithmetic operators on integers, the

integral promotion

does not apply to the x and y arguments.

If two arguments of different type are passed, the call fails to compile, i.e. the behavior relative to

template argument deduction

is the same as for

std::min

or

std::max

.

Most modern hardware architectures have efficient support for saturation arithmetic on

SIMD vectors

, including

SSE2

for

x86

and

NEON

for

ARM

.

Feature-test

macro ValueStdFeature

__cpp_lib_saturation_arithmetic

202311L

(C++26)Saturation arithmetic

202603L

(C++26)Renaming saturation arithmetic functions Possible implementation

See

libstdc++ (GCC)

,

libc++ (Clang)

.

Example

Run this code

#include<climits>#include<limits>#include<numeric>static_assert(CHAR_BIT==8);static_assert(UCHAR_MAX==255);intmain(){constexprinta=std::saturating_add(3,4);// no saturation occurs, T = intstatic_assert(a==7);constexprunsignedcharb=std::saturating_add<unsignedchar>(UCHAR_MAX,4);// saturatedstatic_assert(b==UCHAR_MAX);constexprunsignedcharc=std::saturating_add(UCHAR_MAX,4);// not saturated, T = int// saturating_add(int, int) returns int tmp == 259,// then assignment truncates 259 % 256 == 3 (might yield int -> unsigned char warning)static_assert(c==3);// unsigned char d = std::saturating_add(252, c); // Error: inconsistent deductions for Tconstexprunsignedchare=std::saturating_add<unsignedchar>(251,a);// saturatedstatic_assert(e==UCHAR_MAX);// 251 is of type T = unsigned char, `a` is converted to unsigned char value;// might yield an int -> unsigned char conversion warning for `a`constexprsignedcharf=std::saturating_add<signedchar>(-123,-3);// not saturatedstatic_assert(f==-126);constexprsignedcharg=std::saturating_add<signedchar>(-123,-13);// saturatedstatic_assert(g==std::numeric_limits<signedchar>::min());// g == -128}See also

saturating_sub

(C++26)

saturating subtraction operation on two integers
(function template)

[edit]

saturating_mul

(C++26)

saturating multiplication operation on two integers
(function template)

[edit]

saturating_div

(C++26)

saturating division operation on two integers
(function template)

[edit]

saturating_cast

(C++26)

returns an integer value clamped to the range of another integer type
(function template)

[edit]

clamp

(C++17)

clamps a value between a pair of boundary values
(function template & algorithm function object)

[edit]

ranges::clamp

(C++20)

in_range

(C++20)

checks if an integer value is in the range of a given integer type
(function template)

[edit]

min

[static]

returns the smallest finite value of the given non-floating-point type, or the smallest positive normal value of the given floating-point type
(public static member function of std::numeric_limits<T>)

[edit]

max

[static]

returns the largest finite value of the given type
(public static member function of std::numeric_limits<T>)

[edit]

External links