Namespaces
Variants

std:: div_sat

From cppreference.net
Saturation arithmetic
Functions
(C++26)
(C++26)
(C++26)
div_sat
(C++26)
Определено в заголовке <numeric>
template < class T >
constexpr T div_sat ( T x, T y ) noexcept ;
(начиная с C++26)

Вычисляет насыщающее деление x / y . Если T является знаковым целочисленным типом, x является наименьшим (самым отрицательным) значением T , и y == - 1 , возвращает наибольшее значение T ; в противном случае возвращает x / y .

y не должен быть 0 , иначе поведение не определено. Вызов функции не является core constant expression , если происходит неопределённое поведение.

Эта перегрузка участвует в разрешении перегрузки только если 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 .

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

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

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

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

namespace detail {
template<class T>
concept standard_or_extended_integral =
     std::is_integral_v<T> &&
    !std::is_same_v<std::remove_cv_t<T>, bool> &&
    !std::is_same_v<std::remove_cv_t<T>, char> &&
    !std::is_same_v<std::remove_cv_t<T>, char8_t> &&
    !std::is_same_v<std::remove_cv_t<T>, char16_t> &&
    !std::is_same_v<std::remove_cv_t<T>, char32_t> &&
    !std::is_same_v<std::remove_cv_t<T>, wchar_t>;
} // namespace detail
template<detail::standard_or_extended_integral T>
constexpr T div_sat( T x, T y ) noexcept
{
    if constexpr (std::is_signed_v<T>)
        if (x == std::numeric_limits<T>::min() && y == -1)
            return std::numeric_limits<T>::max();
    return x / y;
}
**Примечание:** Весь код C++ внутри тегов `
` и `` оставлен без изменений, как и требовалось. HTML-теги и атрибуты также сохранены в оригинальном виде.

Пример

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

#include <climits>
#include <numeric>
static_assert
(""
    && (std::div_sat<int>(6, 3) == 2) // not saturated
    && (std::div_sat<int>(INT_MIN, -1) == INT_MAX) // saturated
    && (std::div_sat<unsigned>(6, 3) == 2) // not saturated
);
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