ckd_sub
| Definiert im Header <stdckdint.h>
|
||
#define ckd_sub( result, a, b ) /* implementation-defined */
// exposed interface:
bool ckd_sub( type1* result, type2 a, type3 b );
|
(seit C23) | |
Berechnet die Subtraktion x - y und speichert das Ergebnis in *result. Die Subtraktion wird so durchgeführt, als ob beide Operanden in einem vorzeichenbehafteten Ganzzahltyp mit unendlichem Wertebereich dargestellt wären und das Ergebnis dann von diesem Ganzzahltyp nach type1 konvertiert würde. Wenn der *result zugewiesene Wert das mathematische Ergebnis der Operation korrekt darstellt, gibt es false zurück. Andernfalls gibt es true zurück. In diesem Fall ist der *result zugewiesene Wert das mathematische Ergebnis der Operation, um die Breite von *result umbrochen.
Parameter
| a, b | - | Ganzzahlwerte |
| result | - | Adresse, an der das Ergebnis gespeichert werden soll |
Rückgabewert
false wenn der *result zugewiesene Wert das mathematische Ergebnis der Subtraktion korrekt darstellt, true andernfalls.
Anmerkung
Sowohl type2 als auch type3 müssen ein beliebiger ganzzahliger Typ sein, der nicht „einfaches“ char, bool, ein bitgenauer Ganzzahltyp oder ein Aufzählungstyp ist, und sie können identisch sein. *result muss ein veränderbarer Lvalue eines beliebigen ganzzahligen Typs sein, der nicht „einfaches“ char, bool, ein bitgenauer Ganzzahltyp oder ein Aufzählungstyp ist.
Es wird empfohlen, eine Diagnosemeldung zu erzeugen, wenn type2 oder type3 keine geeigneten Ganzzahltypen sind, oder wenn *result kein veränderbarer Lvalue eines geeigneten Ganzzahltyps ist.
Beispiel
#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");
}
Ausgabe:
-2 - 1 == -3 (OK)
-2 - 32767 == 32767 (Underflow)
-2 - 32767 == -32769 (OK)
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
- 7.20.1 Die ckd_-Makros für geprüfte Ganzzahloperationen (S. 311)
Siehe auch
(C23) |
Geprüfte Additionsoperation für zwei Ganzzahlen (typgenerisches Funktionsmakro) |
(C23) |
Geprüfte Multiplikationsoperation für zwei Ganzzahlen (typgenerisches Funktionsmakro) |
C++-Dokumentation für ckd_sub
| |