ckd_sub
| Definido en el encabezado <stdckdint.h>
|
||
#define ckd_sub( result, a, b ) /* implementation-defined */
// exposed interface:
bool ckd_sub( type1* result, type2 a, type3 b );
|
(desde C23) | |
Calcula la resta x - y y almacena el resultado en *result. La resta 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. En caso 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 |
| resultado | - | 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 resta, true en caso contrario.
Nota
Tanto type2 como type3 deben ser cualquier tipo entero que no sea "simple" char, bool, un tipo entero de precisión de bits, o un tipo enumerado, y pueden ser el mismo. *result debe ser un lvalue modificable de cualquier tipo entero que no sea "simple" 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>
int main()
{
int16_t result1;
constexpr int8_t x1 = -2;
constexpr int16_t y1 = 1;
const bool underflow1 = ckd_sub(&result1, x1, y1);
printf("%i - %i == %i (%s)\n", x1, y1, result1, underflow1 ? "Underflow" : "OK");
int16_t result2;
constexpr int8_t x2 = -2;
constexpr int16_t y2 = INT16_MAX;
const bool underflow2 = ckd_sub(&result2, x2, y2);
printf("%i - %i == %i (%s)\n", x2, y2, result2, underflow2 ? "Underflow" : "OK");
int32_t result3;
constexpr int8_t x3 = -2;
constexpr int16_t y3 = INT16_MAX;
const bool underflow3 = ckd_sub(&result3, x3, y3);
printf("%i - %i == %i (%s)\n", x3, y3, result3, underflow3 ? "Underflow" : "OK");
}
Salida:
-2 - 1 == -3 (OK)
-2 - 32767 == 32767 (Underflow)
-2 - 32767 == -32769 (OK)
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
- 7.20.1 Las macros de operación entera con verificación ckd_ (p: 311)
Véase también
(C23) |
operación de suma con verificación en dos enteros (macro de función genérica de tipo) |
(C23) |
operación de multiplicación con verificación en dos enteros (macro de función genérica de tipo) |
Documentación de C++ para ckd_sub
| |