Namespaces
Variants

std::saturating_cast

从 zh.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的值。

注解

功能特性测试宏 值 Std 功能特性
__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)
检查整数值是否在给定整数类型的范围内
(函数模板)