ckd_add
| Definido en el encabezado <stdckdint.h>
|
||
#define ckd_add( result, a, b ) /* implementation-defined */
// exposed interface:
bool ckd_add( type1* result, type2 a, type3 b );
|
(desde C23) | |
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 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.
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
Tanto type2 como type3 deberán ser cualquier tipo entero distinto de “plain” char, bool, un tipo entero de precisión de bits, o un tipo enumerado, y pueden ser iguales. *result deberá ser un lvalue modificable de cualquier tipo entero distinto de “plain” char, bool, un tipo entero de precisión de bits o un tipo enumerado.
Se recomienda producir un mensaje de diagnóstico si type2 o type3 no son tipos enteros adecuados, o si *result no es un lvalue modificable de un tipo entero adecuado.
Ejemplo
#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));
}
Salida:
14 + 28 => 42 (OK)
14 + 65535 => 13 (Overflow)
14 + 65535 => 65549 (OK)
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
- 7.20.1 Las macros de operación de enteros verificados ckd_ (p: 311)
Véase también
(C23) |
operación de resta verificada de dos enteros (macro de función tipo-genérica) |
(C23) |
operación de multiplicación verificada de dos enteros (macro de función tipo-genérica) |
Documentación de C++ para ckd_add
| |