Namespaces
Variants

std::saturating_sub

cppreference.net에서 발췌
 
 
 
 
헤더 <numeric>
template< class T >
constexpr T saturating_sub( 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-한정될 수 있는) bool, char, wchar_t, char8_t, char16_t, char32_t이어서는 안 됩니다. 이러한 유형은 산술용이 아니기 때문입니다.

매개변수

x, y - 정수 값

반환값

포화된 x - y.

참고

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

서로 다른 유형의 두 인수가 전달되면 호출이 컴파일되지 않습니다. 즉, 템플릿 인자 추론에 대한 동작은 std::min 또는 std::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 <numeric>
 
static_assert
(""
    && (std::saturating_sub<int>(INT_MIN + 4, 3) == INT_MIN + 1) // not saturated
    && (std::saturating_sub<int>(INT_MIN + 4, 5) == INT_MIN) // saturated
    && (std::saturating_sub<int>(INT_MAX - 4, -3) == INT_MAX - 1) // not saturated
    && (std::saturating_sub<int>(INT_MAX - 4, -5) == INT_MAX) // saturated
    && (std::saturating_sub<unsigned>(4, 3) == 1) // not saturated
    && (std::saturating_sub<unsigned>(4, 5) == 0) // saturated
);

int main() {}

참조

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

외부 링크

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