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