Namespaces
Variants

ckd_mul

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

Calcule la multiplication x × y et stocke le résultat dans *result. La multiplication est effectuée comme si les deux opérandes étaient représentés dans un type entier signé avec une plage infinie, et le résultat était ensuite converti de ce type entier en type1. Si la valeur attribué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 attribuée à *result est le résultat mathématique de l'opération réduit modulo la largeur de *result.

Paramètres

a, b - valeurs entières
result - adresse où le résultat doit être stocké

Valeur de retour

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

Note

Les deux type2 et type3 doivent être tout type entier autre que « plain » char, 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 « plain » char, 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>

const char* text(bool overflow) { return overflow ? "Overflow" : "OK"; }

int main()
{
    uint8_t x;
    uint16_t y;
    uint16_t result_uint16;
    uint32_t result_uint32;
    bool overflow;

    x = 2;
    y = 21;
    overflow = ckd_mul(&result_uint16, x, y);
    printf("%u * %u => %u (%s)\n", x, y, result_uint16, text(overflow));

    x = 2;
    y = UINT16_MAX;
    overflow = ckd_mul(&result_uint16, x, y);
    printf("%u * %u => %u (%s)\n", x, y, result_uint16, text(overflow));

    x = 2;
    y = UINT16_MAX;
    overflow = ckd_mul(&result_uint32, x, y);
    printf("%u * %u => %u (%s)\n", x, y, result_uint32, text(overflow));
}

Sortie :

2 * 21 => 42 (OK)
2 * 65535 => 65534 (Overflow)
2 * 65535 => 131070 (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 soustraction vérifiée sur deux entiers
(macro de fonction générique de type)
Documentation C++ pour ckd_mul