numeric_saturating_div
numeric_saturating_div (포화 나눗셈)
std::saturating_div는 포화 나눗셈 x / y를 계산하는 함수예요. C++26부터 사용할 수 있어요.
출처: cppreference
본문
<numeric> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.
template< class T >
constexpr T saturating_div( T x, T y ) noexcept;
(since C++26)
포화 나눗셈 x / y를 계산해요. T가 부호 정수 타입이고 x가 T의 가장 작은(가장 음인) 값이며 y == -1이면 T의 가장 큰 값을 반환해요. 그 외에는 x / y를 반환해요.
y는 0이 아니어야 해요. 그렇지 않으면 동작은 정의되지 않아요. 정의되지 않은 동작이 발생하면 함수 호출은 핵심 상수 표현식(core constant expression)이 아니에요.
이 오버로드는 T가 정수 타입일 때만 오버로드 해석에 참여해요. 특히 T는 (cv 한정된) bool, char, wchar_t, char8_t, char16_t, char32_t가 아니어야 해요.
매개변수 (Parameters)
- x, y — 정수 값
반환값 (Return value)
포화된 x / y.
참고 (Notes)
정수의 내장 산술 연산자와 달리, x와 y 인자에는 정수 승격이 적용되지 않아요.
서로 다른 타입의 두 인자를 전달하면 호출이 컴파일되지 않아요.
대부분의 현대 하드웨어 아키텍처는 SIMD 벡터에 대한 포화 산술을 효율적으로 지원해요.
| 피처 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_saturation_arithmetic |
202311L | (C++26) | 포화 산술 |
| 202603L | (C++26) | 포화 산술 함수 이름 변경 |
가능한 구현 (Possible implementation)
namespace detail {
template<class T>
concept integer =
std::is_integral_v<T> &&
!std::is_same_v<std::remove_cv_t<T>, bool> &&
!std::is_same_v<std::remove_cv_t<T>, char> &&
!std::is_same_v<std::remove_cv_t<T>, char8_t> &&
!std::is_same_v<std::remove_cv_t<T>, char16_t> &&
!std::is_same_v<std::remove_cv_t<T>, char32_t> &&
!std::is_same_v<std::remove_cv_t<T>, wchar_t>;
} // namespace detail
template<detail::integer T>
constexpr T saturating_div(T x, T y) noexcept
{
if constexpr (std::is_signed_v<T>)
if (x == std::numeric_limits<T>::min() && y == T(-1))
return std::numeric_limits<T>::max();
return x / y;
}