Spec-Zone.ru › C++

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
}

См. также

saturating_sub
(C++26)
операция вычитания с насыщением двух целых чисел
(шаблон функции)
saturating_mul
(C++26)
операция умножения с насыщением двух целых чисел
(шаблон функции)
saturating_div
(C++26)
операция деления с насыщением двух целых чисел
(шаблон функции)
saturating_cast
(C++26)
возвращает целочисленное значение, ограниченное диапазоном другого целочисленного типа
(шаблон функции)
clamp
(C++17)
ограничивает значение парой граничных значений
(шаблон функции и функциональный объект алгоритма)
ranges::clamp
(C++20)
in_range
(C++20)
проверяет, входит ли целочисленное значение в диапазон заданного целочисленного типа
(шаблон функции)
min
[static]
возвращает наименьшее конечное значение заданного типа, не являющегося типом с плавающей запятой, или наименьшее положительное нормализованное значение заданного типа с плавающей запятой
(общедоступная статическая функция-член std::numeric_limits<T>)
max
[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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API