Namespaces
Variants

std::saturating_cast

De es.cppreference.net
 
 
 
 
Definido en el encabezado <numeric>
template< class T, class U >
constexpr T saturating_cast( U x ) noexcept;
(desde C++26)

Convierte el valor x a un valor de tipo T, limitando x entre los valores mínimo y máximo del tipo T.

El programa está mal formado si T o U no es un tipo entero con signo o sin signo (incluyendo tipo entero estándar y tipo entero extendido).

Parámetros

x - un valor entero

Valor de retorno

  • x, si x es representable como un valor de tipo T. En caso contrario,
  • el valor representable más grande o más pequeño de tipo T, el que esté más cercano al valor de x.

Notas

Macro de prueba de características Valor Estándar Característica
__cpp_lib_saturation_arithmetic 202311L (C++26) Aritmética de saturación
202603L (C++26) Renombramiento de funciones de aritmética de saturación

Posible implementación

Véase libstdc++ (GCC), libc++ (Clang).

Ejemplo

Puede previsualizarse en 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);
}

Véase también

(C++20)
reinterpreta la representación de objetos de un tipo como la de otro
(plantilla de función)
(C++17)
limita un valor entre un par de valores límite
(plantilla de función & objeto función de algoritmo)
(C++20)
comprueba si un valor entero está en el rango de un tipo entero dado
(plantilla de función)