std:: add_sat
|
헤더에 정의됨
<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++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 |