Namespaces
Variants

ckd_mul

De es.cppreference.net
Definido en el encabezado <stdckdint.h>
#define ckd_mul( result, a, b ) /* implementation-defined */
// exposed interface:
bool ckd_mul( type1* result, type2 a, type3 b );
(desde C23)

Calcula la multiplicación x × y y almacena el resultado en *result. La multiplicación se realiza como si ambos operandos estuvieran representados en un tipo entero con signo de rango infinito, y el resultado se convirtiera 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 multiplicación, true en caso contrario.

Nota

Tanto type2 como type3 deben 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 debe ser un lvalor 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 lvalor 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 = 2;
    y = 21;
    overflow = ckd_mul(&result_uint16, x, y);
    printf("%u * %u => %u (%s)\n", x, y, result_uint16, text(overflow));

    x = 2;
    y = UINT16_MAX;
    overflow = ckd_mul(&result_uint16, x, y);
    printf("%u * %u => %u (%s)\n", x, y, result_uint16, text(overflow));

    x = 2;
    y = UINT16_MAX;
    overflow = ckd_mul(&result_uint32, x, y);
    printf("%u * %u => %u (%s)\n", x, y, result_uint32, text(overflow));
}

Salida:

2 * 21 => 42 (OK)
2 * 65535 => 65534 (Overflow)
2 * 65535 => 131070 (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

operación de suma verificada sobre dos enteros
(macro de función genérica de tipo)
operación de resta verificada sobre dos enteros
(macro de función genérica de tipo)