Namespaces
Variants

ckd_sub

Depuis fr.cppreference.net
Défini dans l'en-tête <stdckdint.h>
#define ckd_sub( result, a, b ) /* implementation-defined */
// exposed interface:
bool ckd_sub( type1* result, type2 a, type3 b );
(depuis C23)

Calcule la soustraction x - y et stocke le résultat dans *result. La soustraction est effectuée comme si les deux opérandes étaient représentées dans un type entier signé avec une plage infinie, et le résultat était ensuite converti de ce type entier vers type1. Si la valeur affectée à *result représente correctement le résultat mathématique de l'opération, elle renvoie false. Sinon, elle renvoie true. Dans ce cas, la valeur affectée à *result est le résultat mathématique de l'opération enroulé sur la largeur de *result.

Paramètres

a, b - valeurs entières
result - adresse où stocker le résultat

Valeur de retour

false si la valeur affectée à *result représente correctement le résultat mathématique de la soustraction, true sinon.

Note

Les deux type2 et type3 doivent être de tout type entier autre que « char » simple, bool, un type entier à précision de bits, ou un type énuméré, et ils peuvent être identiques. *result doit être une lvalue modifiable de tout type entier autre que « char » simple, bool, un type entier à précision de bits, ou un type énuméré.

Il est recommandé de produire un message de diagnostic si type2 ou type3 ne sont pas des types entiers appropriés, ou si *result n'est pas une lvalue modifiable d'un type entier approprié.

Exemple

#include <limits.h>
#include <stdckdint.h>
#include <stdint.h>
#include <stdio.h>

int main()
{
    int16_t result1;
    constexpr int8_t x1 = -2;
    constexpr int16_t y1 = 1;
    const bool underflow1 = ckd_sub(&result1, x1, y1);
    printf("%i - %i == %i (%s)\n", x1, y1, result1, underflow1 ? "Underflow" : "OK");

    int16_t result2;
    constexpr int8_t x2 = -2;
    constexpr int16_t y2 = INT16_MAX;
    const bool underflow2 = ckd_sub(&result2, x2, y2);
    printf("%i - %i == %i (%s)\n", x2, y2, result2, underflow2 ? "Underflow" : "OK");

    int32_t result3;
    constexpr int8_t x3 = -2;
    constexpr int16_t y3 = INT16_MAX;
    const bool underflow3 = ckd_sub(&result3, x3, y3);
    printf("%i - %i == %i (%s)\n", x3, y3, result3, underflow3 ? "Underflow" : "OK");
}

Sortie :

-2 - 1 == -3 (OK)
-2 - 32767 == 32767 (Underflow)
-2 - 32767 == -32769 (OK)

Références

  • Norme C23 (ISO/IEC 9899:2024) :
  • 7.20.1 Les macros d'opérations entières vérifiées ckd_ (p: 311)

Voir aussi

opération d'addition vérifiée sur deux entiers
(macro de fonction générique de type)
opération de multiplication vérifiée sur deux entiers
(macro de fonction générique de type)
Documentation C++ pour ckd_sub