Namespaces
Variants

std::saturating_sub

От ru.cppreference.net
 
 
 
 
Определён в заголовке <numeric>
template< class T >
constexpr T saturating_sub( 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.

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_saturation_arithmetic 202311L (C++26) Насыщающая арифметика
202603L (C++26) Переименование функций насыщающей арифметики

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

См. libstdc++ (GCC), libc++ (Clang).

Пример

Можно просмотреть на Compiler Explorer

#include <climits>
#include <numeric>
 
static_assert
(""
    && (std::saturating_sub<int>(INT_MIN + 4, 3) == INT_MIN + 1) // not saturated
    && (std::saturating_sub<int>(INT_MIN + 4, 5) == INT_MIN) // saturated
    && (std::saturating_sub<int>(INT_MAX - 4, -3) == INT_MAX - 1) // not saturated
    && (std::saturating_sub<int>(INT_MAX - 4, -5) == INT_MAX) // saturated
    && (std::saturating_sub<unsigned>(4, 3) == 1) // not saturated
    && (std::saturating_sub<unsigned>(4, 5) == 0) // saturated
);

int main() {}

См. также

насыщающая операция сложения двух целых чисел
(шаблон функции)
насыщающая операция умножения двух целых чисел
(шаблон функции)
насыщающая операция деления двух целых чисел
(шаблон функции)
возвращает целое значение, ограниченное диапазоном другого целочисленного типа
(шаблон функции)
(C++17)
ограничивает значение между парой граничных значений
(шаблон функции & функциональный объект алгоритма)
(C++20)
проверяет, находится ли целое значение в диапазоне данного целочисленного типа
(шаблон функции)
[static]
возвращает наименьшее конечное значение данного нечислового типа с плавающей запятой, или наименьшее положительное нормальное значение данного числа с плавающей запятой
(открытая статическая функция-элемент std::numeric_limits<T>)
[static]
возвращает наибольшее конечное значение данного типа
(открытая статическая функция-элемент std::numeric_limits<T>)

Внешние ссылки

1.  Безусловная реализация насыщающей арифметики — Locklessinc.com, 2012