From cppreference.com
template<classT>constexprTsaturating_mul(Tx,Ty)noexcept;(since C++26)Computes the
multiplication 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<numeric>static_assert(""&&(std::saturating_mul<int>(2,3)==6)// not saturated&&(std::saturating_mul<int>(INT_MAX/2,3)==INT_MAX)// saturated&&(std::saturating_mul<int>(-2,3)==-6)// not saturated&&(std::saturating_mul<int>(INT_MIN/-2,-3)==INT_MIN)// saturated&&(std::saturating_mul<unsigned>(2,3)==6)// not saturated&&(std::saturating_mul<unsigned>(UINT_MAX/2,3)==UINT_MAX)// saturated);intmain(){}See also
(C++26)
saturating addition operation on two integers
(function template)
(C++26)
saturating subtraction 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