Namespaces
Variants

std::saturating_cast

С ru.cppreference.net
 
 
 
 
Определена в заголовке <numeric>
template< class T, class U >
constexpr T saturating_cast( U x ) noexcept;
(начиная с C++26)

Преобразует значение x в значение типа T, ограничивая x между минимальным и максимальным значениями типа T.

Программа является некорректной, если T или U не является знаковым или беззнаковым целочисленным типом (включая стандартный целочисленный тип и расширенный целочисленный тип).

Параметры

x - целочисленное значение

Возвращаемое значение

  • x, если x представимо как значение типа T. В противном случае,
  • наибольшее или наименьшее представимое значение типа T, в зависимости от того, что ближе к значению x.

Примечания

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

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

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

Пример

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

#include <cstdint>
#include <limits>
#include <numeric>

int main()
{
    constexpr std::int16_t x1{696};

    constexpr std::int8_t x2 = std::saturating_cast<std::int8_t>(x1);
    static_assert(x2 == std::numeric_limits<std::int8_t>::max());

    constexpr std::uint8_t x3 = std::saturating_cast<std::uint8_t>(x1);
    static_assert(x3 == std::numeric_limits<std::uint8_t>::max());

    constexpr std::int16_t y1{-696};

    constexpr std::int8_t y2 = std::saturating_cast<std::int8_t>(y1);
    static_assert(y2 == std::numeric_limits<std::int8_t>::min());

    constexpr std::uint8_t y3 = std::saturating_cast<std::uint8_t>(y1);
    static_assert(y3 == 0);
}

Смотри также

(C++20)
переинтерпретирует объектное представление одного типа как другого
(шаблон функции)
(C++17)
ограничивает значение между парой граничных значений
(шаблон функции & функциональный объект алгоритма)
(C++20)
проверяет, находится ли целочисленное значение в диапазоне заданного целочисленного типа
(шаблон функции)