ckd_mul
| Definiert im Header <stdckdint.h>
|
||
#define ckd_mul( result, a, b ) /* implementation-defined */
// exposed interface:
bool ckd_mul( type1* result, type2 a, type3 b );
|
(seit C23) | |
Berechnet die Multiplikation x × y und speichert das Ergebnis in *result. Die Multiplikation wird durchgeführt, als ob beide Operanden in einem vorzeichenbehafteten Integer-Typ mit unendlichem Bereich dargestellt wären, und das Ergebnis dann von diesem Integer-Typ in type1. Wenn der Wert, der *result das mathematische Ergebnis der Operation korrekt darstellt, gibt es false. Andernfalls gibt es true. In diesem Fall ist der Wert, der *result zugewiesen wird, das mathematische Ergebnis der Operation, das auf die Breite von *result.
Parameter
| a, b | - | Integer-Werte |
| Ergebnis | - | Adresse, an der das Ergebnis gespeichert werden soll |
Rückgabewert
false Wenn der Wert, der *result das mathematische Ergebnis der Multiplikation korrekt darstellt, true ansonsten.
Hinweis
Beide type2 und type3 müssen ein beliebiger Integer-Typ sein, der kein „einfacher“ char, bool, ein bitgenauer Integer-Typ, oder ein Aufzählungstyp, und sie können identisch sein. *result muss ein modifizierbarer L-Wert eines beliebigen Integer-Typs sein, der kein „einfacher“ char, bool, ein bitgenauer Integer-Typ oder ein Aufzählungstyp.
Es wird empfohlen, eine Diagnosemeldung zu erzeugen, wenn type2 oder type3 keine geeigneten Integer-Typen sind oder wenn *result kein modifizierbarer L-Wert eines geeigneten Integer-Typs ist.
Beispiel
#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));
}
Ausgabe:
2 * 21 => 42 (OK)
2 * 65535 => 65534 (Overflow)
2 * 65535 => 131070 (OK)
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
- 7.20.1 Die ckd_-Makros für geprüfte Integer-Operationen (S. 311)
Siehe auch
(C23) |
geprüfte Additionsoperation für zwei ganze Zahlen (typgenerisches Funktionsmakro) |
(C23) |
geprüfte Subtraktionsoperation für zwei ganze Zahlen (typgenerisches Funktionsmakro) |
C++-Dokumentation für ckd_mul
| |