Namespaces
Variants

ckd_add

From cppreference.net
Definido en el encabezado <stdckdint.h>
template < class type1, class type2, class type3 >
bool ckd_add ( type1 * result, type2 a, type3 b ) ;
(desde C++26)

Calcula la suma x + y y almacena el resultado en * result . La suma se realiza como si ambos operandos estuvieran representados en un tipo entero con signo de rango infinito, y luego el resultado se convirtiera de este tipo entero a type1 . Si el valor asignado a * result representa correctamente el resultado matemático de la operación, devuelve false . De lo contrario, devuelve true . En este caso, el valor asignado a * result es el resultado matemático de la operación ajustado al ancho de * result .

Contenidos

Parámetros

a, b - valores enteros
result - dirección donde debe almacenarse el resultado

Valor de retorno

false si el valor asignado a * result representa correctamente el resultado matemático de la suma, true en caso contrario.

Nota

La plantilla de función ckd_add tiene la misma semántica que la macro genérica de tipos correspondiente con el mismo nombre especificada en C23 .

Cada uno de los tipos type1 , type2 , y type3 es un tipo entero con o sin signo sin calificadores cv.

Se recomienda producir un mensaje de diagnóstico si type2 o type3 no son tipos enteros adecuados, o si * result no es un valor-l modificable de un tipo entero adecuado.

Ejemplo

Compiler Explorer vista previa .

#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");
}

Salida posible:

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

Referencias

  • Estándar C++26 (ISO/IEC 14882:2026):
  • 29.11.2 Operaciones con enteros verificados

Véase también

(C++26)
operación de resta verificada en dos enteros
(plantilla de función)
(C++26)
operación de multiplicación verificada en dos enteros
(plantilla de función)
Documentación C para ckd_add