std::saturating_add
Определено в заголовочном файле <numeric> | ||
|---|---|---|
template< class T > constexpr T saturating_add( T x, T y ) noexcept; | (начиная с C++26) |
Вычисляет сложение с насыщением x + y. Эта операция (в отличие от встроенных арифметических операций над целыми числами) ведёт себя так, как если бы она была математической операцией с бесконечным диапазоном. Обозначим q результат такой операции. Возвращает:
-
q, еслиqпредставимо в виде значения типаT. В противном случае - наибольшее или наименьшее значение типа
T— в зависимости от того, какое из них ближе кq.
Эта перегрузка участвует в разрешении перегрузки, только если T является целочисленным типом, то есть одним из следующих типов: signedchar, short, int, long, longlong, расширенный знаковый целочисленный тип или беззнаковая версия одного из этих типов. В частности, T не должен быть типом bool, char, wchar_t, char8_t, char16_t или char32_t (возможно, с квалификаторами cv), поскольку эти типы не предназначены для арифметических операций.
Параметры
| x, y | - | целочисленные значения |
Возвращаемое значение
Сумма x + y с насыщением.
Примечания
В отличие от встроенных арифметических операторов над целыми числами, к аргументам x и y не применяется целочисленное продвижение.
Если переданы два аргумента разных типов, вызов не компилируется, то есть в отношении выведения аргументов шаблона поведение такое же, как у std::min или std::max.
Большинство современных аппаратных архитектур эффективно поддерживают арифметику с насыщением для векторов SIMD, включая SSE2 для x86 и NEON для ARM.
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_saturation_arithmetic | 202311L | (C++26) | Арифметика с насыщением |
202603L | (C++26) | Переименование функций арифметики с насыщением |
Возможная реализация
См. libstdc++ (GCC), libc++ (Clang).
Пример
#include <climits>
#include <limits>
#include <numeric>
static_assert(CHAR_BIT == 8);
static_assert(UCHAR_MAX == 255);
int main()
{
constexpr int a = std::saturating_add(3, 4); // no saturation occurs, T = int
static_assert(a == 7);
constexpr unsigned char b = std::saturating_add<unsigned char>(UCHAR_MAX, 4); // saturated
static_assert(b == UCHAR_MAX);
constexpr unsigned char c = 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 T
constexpr unsigned char e = std::saturating_add<unsigned char>(251, a); // saturated
static_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`
constexpr signed char f = std::saturating_add<signed char>(-123, -3); // not saturated
static_assert(f == -126);
constexpr signed char g = std::saturating_add<signed char>(-123, -13); // saturated
static_assert(g == std::numeric_limits<signed char>::min()); // g == -128
}
См. также
|
(C++26) | операция вычитания с насыщением двух целых чисел (шаблон функции) |
|
(C++26) | операция умножения с насыщением двух целых чисел (шаблон функции) |
|
(C++26) | операция деления с насыщением двух целых чисел (шаблон функции) |
|
(C++26) | возвращает целочисленное значение, ограниченное диапазоном другого целочисленного типа (шаблон функции) |
|
(C++17) | ограничивает значение парой граничных значений (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
|
(C++20) | проверяет, входит ли целочисленное значение в диапазон заданного целочисленного типа (шаблон функции) |
|
[static] | возвращает наименьшее конечное значение заданного типа, не являющегося типом с плавающей запятой, или наименьшее положительное нормализованное значение заданного типа с плавающей запятой (общедоступная статическая функция-член std::numeric_limits<T>) |
|
[static] | возвращает наибольшее конечное значение заданного типа (общедоступная статическая функция-член std::numeric_limits<T>) |
Внешние ссылки
| 1. | Реализация арифметики с насыщением без ветвлений — Locklessinc.com, 2012 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/saturating_add