Namespaces
Variants

ckd_add

Von de.cppreference.net
Definiert in Header <stdckdint.h>
#define ckd_add( result, a, b ) /* implementation-defined */
// exposed interface:
bool ckd_add( type1* result, type2 a, type3 b );
(seit C23)

Berechnet die Addition x + y und speichert das Ergebnis in *result. Die Addition wird so 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 konvertiert wurde. Wenn der an *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 an *result zugewiesene Wert das mathematische Ergebnis der Operation, das auf die Breite von *result umgebrochen ist.

Parameter

a, b - Ganzzahlen
Ergebnis - Adresse, an der das Ergebnis gespeichert werden soll

Rückgabewert

false wenn der an *result zugewiesene Wert das mathematische Ergebnis der Addition korrekt darstellt, true andernfalls.

Hinweis

Sowohl type2 als auch type3 müssen ein beliebiger Integer-Typ sein, der nicht „plain“ char, bool, ein bitgenauer ganzzahliger Typ oder ein Aufzählungstyp ist, und sie können identisch sein. *result muss ein modifizierbarer Lvalue eines beliebigen Integer-Typs sein, der nicht „plain“ char, bool, ein bitgenauer ganzzahliger Typ oder ein Aufzählungstyp ist.

Es wird empfohlen, eine Diagnosemeldung auszugeben, wenn type2 oder type3 keine geeigneten Integer-Typen sind oder wenn *result kein modifizierbarer Lvalue 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 = 14;
    y = 28;
    overflow = ckd_add(&result_uint16, x, y);
    printf("%u + %u => %u (%s)\n", x, y, result_uint16, text(overflow));

    x = 14;
    y = UINT16_MAX;
    overflow = ckd_add(&result_uint16, x, y);
    printf("%u + %u => %u (%s)\n", x, y, result_uint16, text(overflow));

    x = 14;
    y = UINT16_MAX;
    overflow = ckd_add(&result_uint32, x, y);
    printf("%u + %u => %u (%s)\n", x, y, result_uint32, text(overflow));
}

Ausgabe:

14 + 28 => 42 (OK)
14 + 65535 => 13 (Overflow)
14 + 65535 => 65549 (OK)

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.20.1 Die Makros für geprüfte Integer-Operationen ckd_ (S. 311)

Siehe auch

geprüfte Subtraktionsoperation für zwei ganze Zahlen
(typgenerisches Funktionsmakro)
geprüfte Multiplikationsoperation für zwei ganze Zahlen
(typgenerisches Funktionsmakro)
C++-Dokumentation für ckd_add