std::saturating_cast
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 | - | 정수 값 |
반환값
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) |
|
(C++20) |
정수 값이 주어진 정수 형식의 범위 내에 있는지 확인합니다 (함수 템플릿) |