Spec-Zone.ru › C++

std::add_sat

Определено в заголовочном файле <numeric>
template< class T >
constexpr T add_sat( T x, T y ) noexcept;
(с C++26)

Вычисляет насыщающее сложение x + y. Данная операция (в отличие от встроенных арифметических операций над целыми числами) ведет себя так, как будто она является математической операцией с бесконечным диапазоном. Пусть q обозначает результат такой операции. Возвращает:

  • q, если q представимо как значение типа T. В противном случае,
  • наибольшее или наименьшее значение типа T, которое ближе всего к q.

Этот перегруз участвует в разрешении перегрузки только если T является целым типом, то есть: signed char, short, int, long, long long, расширенный тип целого со знаком или беззнаковый аналог таких типов. В частности, T не должен быть (возможно, с квалификаторами cv) bool, char, wchar_t, char8_t, char16_t и char32_t, так как эти типы не предназначены для арифметики.

Параметры

x, y - целочисленные значения

Значение результата

Насыщающее x + y.

Исключение

Не выбрасывает никаких исключений.

Примечания

В отличие от встроенных арифметических операторов над целыми числами, преобразование целых типов не применяется к аргументам x и y.

Если передаются два аргумента разных типов, вызов не скомпилируется, т.е. поведение относительно вывода шаблонных аргументов такое же, как для std::min или std::max.

Большинство современных архитектур процессоров имеют эффективную поддержку насыщающей арифметики для векторов SIMD, включая SSE2 для x86 и NEON для ARM.

Макро-тест на наличие функции Значение Std Функция
__cpp_lib_saturation_arithmetic 202311L (C++26) Насыщающая арифметика

Возможная реализация

См. libstdc++ (gcc).

Пример

Предварительный просмотр можно выполнить на Compiler Explorer.

#include <climits>
#include <limits>
#include <numeric>
 
static_assert(CHAR_BIT == 8);
static_assert(UCHAR_MAX == 255);
 
int main()
{
    constexpr int a = std::add_sat(3, 4); // no saturation occurs, T = int
    static_assert(a == 7);
 
    constexpr unsigned char b = std::add_sat<unsigned char>(UCHAR_MAX, 4); // saturated
    static_assert(b == UCHAR_MAX);
 
    constexpr unsigned char c = std::add_sat(UCHAR_MAX, 4); // not saturated, T = int
        // add_sat(int, int) returns int tmp == 259,
        // then assignment truncates 259 % 256 == 3
    static_assert(c == 3);
 
//  unsigned char d = std::add_sat(252, c); // Error: inconsistent deductions for T
 
    constexpr unsigned char e = std::add_sat<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::add_sat<signed char>(-123, -3); // not saturated
    static_assert(f == -126);
 
    constexpr signed char g = std::add_sat<signed char>(-123, -13); // saturated
    static_assert(g == std::numeric_limits<signed char>::min()); // g == -128
}

См. также

sub_sat
(C++26)
операция насыщающего вычитания для двух целых чисел
(шаблон функции)
mul_sat
(C++26)
операция насыщающего умножения для двух целых чисел
(шаблон функции)
div_sat
(C++26)
операция насыщающего деления для двух целых чисел
(шаблон функции)
saturate_cast
(C++26)
возвращает целое значение, ограниченное диапазоном другого целого типа
(шаблон функции)
clamp
(C++17)
ограничивает значение между парой граничных значений
(шаблон функции)
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/w/cpp/numeric/add_sat

Spec-Zone.ru

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