numeric_saturating_cast
numeric_saturating_cast (포화 변환)
std::saturating_cast는 값 x를 타입 T의 값으로 변환하면서 T의 최솟값과 최댓값 사이로 x를 고정(clamping)하는 함수예요. C++26부터 사용할 수 있어요.
출처: cppreference
본문
<numeric> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.
template< class T, class U >
constexpr T saturating_cast( U x ) noexcept;
(since C++26)
값 x를 타입 T의 값으로 변환해요. x를 T 타입의 최솟값과 최댓값 사이로 고정해요.
T 또는 U가 부호 또는 무부호 정수 타입(표준 정수 타입과 확장 정수 타입 포함)이 아니면 프로그램은 ill-formed예요.
매개변수 (Parameters)
- x — 정수 값
반환값 (Return value)
- x를 T 타입의 값으로 표현할 수 있으면 x. 그 외에는,
- x의 값에 더 가까운 T 타입의 가장 큰 또는 가장 작은 표현 가능한 값.
참고 (Notes)
| 피처 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_saturation_arithmetic |
202311L | (C++26) | 포화 산술 |
| 202603L | (C++26) | 포화 산술 함수 이름 변경 |
가능한 구현 (Possible implementation)
libstdc++ (GCC), libc++ (Clang) 참고.
예제 (Example)
이 코드를 실행해 봐요.
#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);
}