Namespaces
Variants

std::saturating_add

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

포화 덧셈을 계산합니다. 이 연산은 (정수에 대한 내장 산술 연산과 달리) 무한 범위를 가진 수학 연산인 것처럼 동작합니다. 이 연산의 결과를 x + y라 하겠습니다. 반환값: 이 q 유형의 값으로 표현 가능하면

  • qq. T그렇지 않으면,
  • T 유형의 가장 큰 값 또는 가장 작은 값 중 무한 정밀도 결과에 더 가까운 값. q

이 오버로드는 T가 정수 유형인 경우에만 오버로드 해결에 참여합니다, 즉: , signed charshort, intlong, long long 확장 부호 있는 정수 유형, 또는 이러한 유형의 부호 없는 버전입니다. 특히, T는 (cv 한정이 있을 수 있는) boolcharwchar_tchar8_tchar16_tchar32_t이어서는 안 됩니다. 이러한 유형은 산술에 적합하지 않기 때문입니다.

매개변수

x, y - 정수 값

반환값

포화된 x + y.

참고

정수에 대한 내장 산술 연산자와 달리, 정수 승격이 및 xy 인수에 적용되지 않습니다.

서로 다른 유형의 두 인수가 전달되면 호출이 컴파일에 실패합니다. 즉, 템플릿 인수 추론에 관한 동작은 또는 std::minstd::max와 동일합니다.

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

기능 테스트 매크로 값 표준 기능
__cpp_lib_saturation_arithmetic 202311L (C++26) 포화 연산
202603L (C++26) 포화 연산 함수 이름 변경

가능한 구현

libstdc++ (GCC), libc++ (Clang)을 참조하십시오.

예제

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

#include <climits>
#include <limits>
#include <numeric>

static_assert(CHAR_BIT == 8);
static_assert(UCHAR_MAX == 255);

int main()
{
    constexpr int a = std::saturating_add(3, 4); // no saturation occurs, T = int
    static_assert(a == 7);

    constexpr unsigned char b = std::saturating_add<unsigned char>(UCHAR_MAX, 4); // saturated
    static_assert(b == UCHAR_MAX);

    constexpr unsigned char c = std::saturating_add(UCHAR_MAX, 4); // not saturated, T = int
        // saturating_add(int, int) returns int tmp == 259,
        // then assignment truncates 259 % 256 == 3 (might yield int -> unsigned char warning)
    static_assert(c == 3);

//  unsigned char d = std::saturating_add(252, c); // Error: inconsistent deductions for T

    constexpr unsigned char e = std::saturating_add<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::saturating_add<signed char>(-123, -3); // not saturated
    static_assert(f == -126);

    constexpr signed char g = std::saturating_add<signed char>(-123, -13); // saturated
    static_assert(g == std::numeric_limits<signed char>::min()); // g == -128
}

같이 보기

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

외부 링크

1.  분기 없는 포화 연산 구현 — Locklessinc.com, 2012