Namespaces
Variants

std:: sub_sat

From cppreference.net
Saturation arithmetic
Functions
(C++26)
sub_sat
(C++26)
(C++26)
(C++26)
Определено в заголовке <numeric>
template < class T >
constexpr T sub_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 .

Примечания

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

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

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

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_saturation_arithmetic 202311L (C++26) Saturation arithmetic

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

См. libstdc++ (gcc) .

Пример

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

#include <climits>
#include <numeric>
static_assert
(""
    && (std::sub_sat<int>(INT_MIN + 4, 3) == INT_MIN + 1) // не насыщено
    && (std::sub_sat<int>(INT_MIN + 4, 5) == INT_MIN) // насыщено
    && (std::sub_sat<int>(INT_MAX - 4, -3) == INT_MAX - 1) // не насыщено
    && (std::sub_sat<int>(INT_MAX - 4, -5) == INT_MAX) // насыщено
    && (std::sub_sat<unsigned>(4, 3) == 1) // не насыщено
    && (std::sub_sat<unsigned>(4, 5) == 0) // насыщено
);
int main() {}

Смотрите также

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

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

1. Безусловная реализация насыщающей арифметики — Locklessinc.com, 2012
2. C++ Weekly - Эпизод 459 - Насыщающие математические операции в C++26 — Youtube.com, 2024-12-16