ckd_mul
| 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
(C23) |
opération d'addition vérifiée sur deux entiers (macro de fonction générique de type) |
(C23) |
opération de soustraction vérifiée sur deux entiers (macro de fonction générique de type) |
Documentation C++ pour ckd_mul
| |