Namespaces
Variants

std::saturating_cast

ja.cppreference.net より
 
 
 
 
ヘッダ <numeric>
template< class T, class U >
constexpr T saturating_cast( U x ) noexcept;
で定義 (C++26 以上)

値 x を型 T の値に変換し、x を型 T の最小値と最大値の間にクランプします。

T または U が符号付きまたは符号なしの 整数型 (標準整数型および 拡張整数型を含む) でない場合、プログラムは ill-formed です。

引数

x - 整数値

戻り値

  • xx が型 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)
整数値が指定された整数型の範囲内にあるかどうか調べる
(関数テンプレート)