Namespaces
Variants

ckd_add

From de.cppreference.net
Definiert im Header <stdckdint.h>
template < class type1, class type2, class type3 >
bool ckd_add ( type1 * result, type2 a, type3 b ) ;
(seit C++26)

Berechnet die Addition x + y und speichert das Ergebnis in * result . Die Addition 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 in type1 konvertiert wurde. Wenn der zugewiesene Wert für * result das mathematische Ergebnis der Operation korrekt darstellt, wird false zurückgegeben. Andernfalls wird true zurückgegeben. In diesem Fall ist der zugewiesene Wert für * result das mathematische Ergebnis der Operation, das auf die Breite von * result umgewrappt wurde.

Inhalt

Parameter

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

Rückgabewert

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

Hinweis

Die Funktionsvorlage ckd_add hat dieselbe Semantik wie das entsprechende typgenerische Makro mit demselben Namen, das in C23 spezifiziert ist.

Jeder der Typen type1 , type2 und type3 ist ein cv-unqualifizierter vorzeichenbehafteter oder vorzeichenloser Ganzzahltyp.

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 <cstdint>
#include <limits>
#include <print>
#include <stdckdint.h>

int main()
{
    const std::uint8_t x{14};
    std::uint16_t y{28}, result1{};
    bool overflow{};

    overflow = ckd_add(&result1, x, y);
    std::println("{} + {} => {} ({})", x, y, result1, overflow ? "Overflow" : "OK");

    y = std::numeric_limits<std::uint16_t>::max();
    overflow = ckd_add(&result1, x, y);
    std::println("{} + {} => {} ({})", x, y, result1, overflow ? "Overflow" : "OK");

    std::uint32_t result2{};
    overflow = ckd_add(&result2, x, y);
    std::println("{} + {} => {} ({})", x, y, result2, overflow ? "Overflow" : "OK");
}

Ausgabe:

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

Referenzen

  • C++26-Standard (ISO/IEC 14882:2026):
  • 29.11.2 Geprüfte Ganzzahloperationen

Siehe auch

(C++26)
Geprüfte Subtraktionsoperation für zwei Ganzzahlen
(Funktionsschablone)
(C++26)
Geprüfte Multiplikationsoperation für zwei Ganzzahlen
(Funktionsschablone)
C-Dokumentation für ckd_add