Namespaces
Variants

std:: add_sat

From cppreference.net
Saturation arithmetic
Functions
add_sat
(C++26)
(C++26)
(C++26)
(C++26)
Défini dans l'en-tête <numeric>
template < class T >
constexpr T add_sat ( T x, T y ) noexcept ;
(depuis C++26)

Calcule l'addition saturante x + y . Cette opération (contrairement aux opérations arithmétiques intégrées sur les entiers ) se comporte comme s'il s'agissait d'une opération mathématique avec une plage infinie . Soit q le résultat d'une telle opération. Retourne :

  • q , si q est représentable comme une valeur de type T . Sinon,
  • la plus grande ou la plus petite valeur de type T , selon celle qui est la plus proche de q .

Cette surcharge participe à la résolution de surcharge uniquement si T est un type entier , c'est-à-dire : signed char , short , int , long , long long , un type entier signé étendu, ou une version non signée de ces types. En particulier, T ne doit pas être (éventuellement qualifié cv) bool , char , wchar_t , char8_t , char16_t , et char32_t , car ces types ne sont pas destinés à l'arithmétique.

Table des matières

Paramètres

x, y - valeurs entières

Valeur de retour

Saturated x + y .

Notes

Contrairement aux opérateurs arithmétiques intégrés sur les entiers, la promotion intégrale ne s'applique pas aux arguments x et y .

Si deux arguments de types différents sont passés, l'appel échoue à la compilation, c'est-à-dire que le comportement relatif à la déduction d'arguments de template est le même que pour std::min ou std::max .

La plupart des architectures matérielles modernes disposent d'une prise en charge efficace de l'arithmétique de saturation pour les vecteurs SIMD , incluant SSE2 pour x86 et NEON pour ARM .

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_saturation_arithmetic 202311L (C++26) Arithmétique de saturation

Implémentation possible

Voir libstdc++ (gcc) .

Exemple

Peut être prévisualisé sur 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); // aucune saturation ne se produit, T = int
    static_assert(a == 7);
    constexpr unsigned char b = std::add_sat<unsigned char>(UCHAR_MAX, 4); // saturé
    static_assert(b == UCHAR_MAX);
    constexpr unsigned char c = std::add_sat(UCHAR_MAX, 4); // non saturé, T = int
        // add_sat(int, int) retourne int tmp == 259,
        // puis l'assignation tronque 259 % 256 == 3
    static_assert(c == 3);
//  unsigned char d = std::add_sat(252, c); // Erreur : déductions incohérentes pour T
    constexpr unsigned char e = std::add_sat<unsigned char>(251, a); // saturé
    static_assert(e == UCHAR_MAX);
        // 251 est de type T = unsigned char, `a` est converti en valeur unsigned char ;
        // peut générer un avertissement de conversion int -> unsigned char pour `a`
    constexpr signed char f = std::add_sat<signed char>(-123, -3); // non saturé
    static_assert(f == -126);
    constexpr signed char g = std::add_sat<signed char>(-123, -13); // saturé
    static_assert(g == std::numeric_limits<signed char>::min()); // g == -128
}

Voir aussi

(C++26)
opération de soustraction saturante sur deux entiers
(modèle de fonction)
(C++26)
opération de multiplication saturante sur deux entiers
(modèle de fonction)
(C++26)
opération de division saturante sur deux entiers
(modèle de fonction)
retourne une valeur entière limitée à la plage d'un autre type entier
(modèle de fonction)
(C++17)
limite une valeur entre une paire de valeurs limites
(modèle de fonction)
(C++20)
vérifie si une valeur entière est dans la plage d'un type entier donné
(modèle de fonction)
[static]
retourne la plus petite valeur finie du type non flottant donné, ou la plus petite valeur normale positive du type flottant donné
(fonction membre publique statique de std::numeric_limits<T> )
[static]
retourne la plus grande valeur finie du type donné
(fonction membre publique statique de std::numeric_limits<T> )

Liens externes

1. Une implémentation sans branchement de l'arithmétique de saturation — Locklessinc.com, 2012
2. C++ Weekly - Ep 459 - Les opérations mathématiques de saturation de C++26 — Youtube.com, 2024-12-16