std:: div_sat
|
Определено в заголовке
<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; } |
` и `` оставлен без изменений, как и требовалось. HTML-теги и атрибуты также сохранены в оригинальном виде.
Пример
Может быть просмотрено на Compiler Explorer .
Смотрите также
|
(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 |
| 2. | C++ Weekly - Эпизод 459 - Насыщающие математические операции в C++26 — Youtube.com, 2024-12-16 |