std::saturating_sub
| Definiert in Header <numeric>
|
||
template< class T >
constexpr T saturating_sub( T x, T y ) noexcept;
|
(seit C++26) | |
Berechnet die sättigende Subtraktion x - y. Diese Operation (anders als eingebaute arithmetische Operationen auf ganzen Zahlen) verhält sich, als ob sie eine mathematische Operation mit einem unendlichen Bereich wäre. Sei q das Ergebnis einer solchen Operation.
Rückgabewert:
q, wennqals Wert des TypsTdarstellbar ist. Andernfalls- der größte oder kleinste Wert des Typs
T, je nachdem welcher näher anqliegt.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn T ein ganzzahliger Typ ist, d.h.: signed char, short, int, long, long long, ein erweiterter vorzeichenbehafteter Ganzzahltyp oder eine vorzeichenlose Version solcher Typen. Insbesondere darf T nicht (möglicherweise cv-qualifiziert) bool, char, wchar_t, char8_t, char16_t und char32_t sein, da diese Typen nicht für Arithmetik vorgesehen sind.
Parameter
| x, y | - | ganzzahlige Werte |
Rückgabewert
Sättigungs-x - y.
Anmerkungen
Anders als bei den eingebauten arithmetischen Operatoren auf ganzen Zahlen findet die integrale Promotion nicht auf die x und y Argumente statt.
Wenn zwei Argumente unterschiedlichen Typs übergeben werden, schlägt der Aufruf fehl, d.h. das Verhalten bezüglich der Template-Argument-Deduktion ist dasselbe wie für std::min oder std::max.
Die meisten modernen Hardwarearchitekturen haben effiziente Unterstützung für Sättigungsarithmetik auf SIMD-Vektoren, einschließlich SSE2 für x86 und NEON für ARM.
| Feature-Test- Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_saturation_arithmetic |
202311L |
(C++26) | Sättigungsarithmetik |
202603L |
(C++26) | Umbenennung von Sättigungsarithmetikfunktionen |
Mögliche Implementierung
Siehe libstdc++ (GCC), libc++ (Clang).
Beispiel
Kann auf 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() {}
Siehe auch
(C++26) |
sättigende Additionsoperation auf zwei ganzen Zahlen (Funktionstemplate) |
(C++26) |
sättigende Multiplikationsoperation auf zwei ganzen Zahlen (Funktionstemplate) |
(C++26) |
sättigende Divisionsoperation auf zwei ganzen Zahlen (Funktionstemplate) |
(C++26) |
gibt einen ganzzahligen Wert zurück, der auf den Bereich eines anderen ganzzahligen Typs begrenzt ist (Funktionstemplate) |
(C++17) |
begrenzt einen Wert zwischen zwei Grenzwerten (Funktionstemplate & Algorithmusfunktionsobjekt) |
(C++20) |
|
(C++20) |
prüft, ob ein ganzzahliger Wert im Bereich eines gegebenen ganzzahligen Typs liegt (Funktionstemplate) |
[static] |
gibt den kleinsten endlichen Wert des gegebenen Nicht-Gleitkommatyps oder den kleinsten positiven normalen Wert des gegebenen Gleitkommatyps zurück (öffentliche statische Memberfunktion von std::numeric_limits<T>)
|
[static] |
gibt den größten endlichen Wert des gegebenen Typs zurück (öffentliche statische Memberfunktion von std::numeric_limits<T>)
|
Externe Links
| 1. | Eine verzweigungsfreie Implementierung der Sättigungsarithmetik — Locklessinc.com, 2012 |