From cppreference.com
template<classT>constexprTsaturating_add(Tx,Ty)noexcept;(since C++26)Computes the
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
, 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
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
is the same as for
or
.
Most modern hardware architectures have efficient support for saturation arithmetic on
, including
for
and
for
.
macro ValueStdFeature
__cpp_lib_saturation_arithmetic
(C++26)Saturation arithmetic
(C++26)Renaming saturation arithmetic functions Possible implementation
See
,
.
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
(C++26)
saturating subtraction operation on two integers
(function template)
(C++26)
saturating multiplication operation on two integers
(function template)
(C++26)
saturating division operation on two integers
(function template)
(C++26)
returns an integer value clamped to the range of another integer type
(function template)
(C++17)
clamps a value between a pair of boundary values
(function template & algorithm function object)
(C++20)
(C++20)
checks if an integer value is in the range of a given integer type
(function template)
[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>)
[static]
returns the largest finite value of the given type
(public static member function of std::numeric_limits<T>)
External links