Namespaces
Variants

ckd_add

来自 zh.cppreference.net
< C | 数值
定义于头文件 <stdckdint.h>
#define ckd_add( result, a, b ) /* implementation-defined */
// exposed interface:
bool ckd_add( type1* result, type2 a, type3 b );
(C23起)

计算加法 x + y 并将结果存储到 *result。该加法执行时如同两个操作数都表示在无限范围的有符号整数类型中,然后将结果从该整数类型转换到 type1。如果赋值给 *result 的值正确表示操作的数学结果,则返回 false。否则,返回 true。在这种情况下,赋值给 *result 的值是操作结果回绕到 *result 的宽度。

参数

a, b - 整数值
result - 指向结果存储位置的地址

返回值

false 如果赋值给 *result 的值正确表示加法操作的数学结果,则为 true,否则为 false。

注解

type2 和 type3 都应为除了“普通” char、bool、位精确整数类型或枚举类型之外的任何整数类型,且它们可以相同。*result 应为除了“普通” char、bool、位精确整数类型或枚举类型之外的任何整数类型的可修改左值。

建议在 type2 或 type3 不是合适的整数类型,或 *result 不是合适整数类型的可修改左值时产生诊断消息。

示例

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

输出:

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

引用

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.20.1 ckd_ 检查整数操作宏 (第311页)

参阅

两个整数的检查减法操作
(泛型函数宏)
两个整数的检查乘法操作
(泛型函数宏)
C++ 文档关于ckd_add