Espacios de nombres
Variantes

ckd_add

De cppreference.com
 
 
 
Definido en el archivo de 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 el resultado se convierte luego 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 envuelto al ancho de *result.

Parámetros

a, b - Valores enteros.
result - Dirección donde se debe almacenar 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 tipo correspondiente con el mismo nombre especificada en C23.

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

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

Ejemplo

Vista previa en Compiler Explorer.

#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 ? "desbordamiento" : "de acuerdo");

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

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

Posible salida:

14 + 28 => 42 (de acuerdo)
14 + 65535 => 13 (desbordamiento)
14 + 65535 => 65549 (de acuerdo)

Referencias

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

Véase también

Operación de resta comprobada entre dos enteros.
(plantilla de función) [editar]
Operación de multiplicación con comprobación de desbordamiento entre dos enteros.
(plantilla de función) [editar]
Documentación de C para ckd_add