Namespaces
Variants

std:: add_sat

From cppreference.net
Saturation arithmetic
Functions
add_sat
(C++26)
(C++26)
(C++26)
(C++26)
헤더에 정의됨 <numeric>
template < class T >
constexpr T add_sat ( T x, T y ) noexcept ;
(C++26부터)

포화 덧셈 x + y 을 계산합니다. 이 연산은 (내장 정수 산술 연산 과 달리) 무한한 범위를 가진 수학적 연산인 것처럼 동작합니다. 이러한 연산의 결과를 q 라고 나타냅니다. 반환값:

  • q , 만약 q 가 타입 T 의 값으로 표현 가능한 경우. 그렇지 않으면,
  • 타입 T 의 최대값 또는 최소값 중 q 에 더 가까운 값.

이 오버로드는 다음 조건에서만 오버로드 해결에 참여합니다: T 정수형 인 경우, 즉: signed char , short , int , long , long long , 확장 부호 정수형, 또는 이러한 타입들의 부호 없는 버전. 특히, T 는 (가능한 cv-qualified) bool , char , wchar_t , char8_t , char16_t , 그리고 char32_t 일 수 없습니다. 이러한 타입들은 산술 연산을 목적으로 하지 않기 때문입니다.

목차

매개변수

x, y - 정수 값

반환값

Saturated x + y .

참고 사항

정수에 대한 내장 산술 연산자와 달리, integral promotion x y 인수에 적용되지 않습니다.

서로 다른 타입의 두 인자가 전달되면, 호출은 컴파일되지 않습니다. 즉, 템플릿 인자 추론 에 관한 동작은 std::min 또는 std::max 와 동일합니다.

대부분의 현대 하드웨어 아키텍처는 SIMD 벡터 에 대한 포화 산술 연산을 효율적으로 지원합니다. 여기에는 SSE2 ( x86 용)와 NEON ( ARM 용)이 포함됩니다.

기능 테스트 매크로 표준 기능
__cpp_lib_saturation_arithmetic 202311L (C++26) 포화 연산

가능한 구현

참조: libstdc++ (gcc) .

예제

Compiler Explorer 에서 미리 볼 수 있습니다.

#include <climits>
#include <limits>
#include <numeric>
static_assert(CHAR_BIT == 8);
static_assert(UCHAR_MAX == 255);
int main()
{
    constexpr int a = std::add_sat(3, 4); // no saturation occurs, T = int
    static_assert(a == 7);
    constexpr unsigned char b = std::add_sat<unsigned char>(UCHAR_MAX, 4); // saturated
    static_assert(b == UCHAR_MAX);
    constexpr unsigned char c = std::add_sat(UCHAR_MAX, 4); // not saturated, T = int
        // add_sat(int, int) returns int tmp == 259,
        // then assignment truncates 259 % 256 == 3
    static_assert(c == 3);
//  unsigned char d = std::add_sat(252, c); // Error: inconsistent deductions for T
    constexpr unsigned char e = std::add_sat<unsigned char>(251, a); // saturated
    static_assert(e == UCHAR_MAX);
        // 251 is of type T = unsigned char, `a` is converted to unsigned char value;
        // might yield an int -> unsigned char conversion warning for `a`
    constexpr signed char f = std::add_sat<signed char>(-123, -3); // not saturated
    static_assert(f == -126);
    constexpr signed char g = std::add_sat<signed char>(-123, -13); // saturated
    static_assert(g == std::numeric_limits<signed char>::min()); // g == -128
}

참고 항목

(C++26)
두 정수에 대한 포화 뺄셈 연산
(함수 템플릿)
(C++26)
두 정수에 대한 포화 곱셈 연산
(함수 템플릿)
(C++26)
두 정수에 대한 포화 나눗셈 연산
(함수 템플릿)
다른 정수 타입의 범위로 고정된 정수 값을 반환
(함수 템플릿)
(C++17)
값을 한 쌍의 경계값 사이로 고정
(함수 템플릿)
(C++20)
정수 값이 주어진 정수 타입의 범위 내에 있는지 확인
(함수 템플릿)
[static]
주어진 비부동소수점 타입의 가장 작은 유한값, 또는 주어진 부동소수점 타입의 가장 작은 양의 정규값을 반환
( std::numeric_limits<T> 의 public static 멤버 함수)
[static]
주어진 타입의 가장 큰 유한값을 반환
( std::numeric_limits<T> 의 public static 멤버 함수)

외부 링크

1. 브랜치 없는 포화 연산 구현 — Locklessinc.com, 2012
2. C++ Weekly - Ep 459 - C++26의 포화 수학 연산 — Youtube.com, 2024-12-16