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