Spec-Zone.ru › C

ckd_add

Определено в заголовке <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.

Примечание

И type2, и type3 должны иметь любой целочисленный тип, кроме «обычного» char, bool, целочисленного типа с точностью до бита или перечисляемого типа; они могут иметь один и тот же тип. *result должно быть изменяемым lvalue любого целочисленного типа, кроме «обычного» char, bool, целочисленного типа с точностью до бита или перечисляемого типа.

Рекомендуется выдавать диагностическое сообщение, если type2 или type3 не имеют подходящего целочисленного типа либо если *result не является изменяемым lvalue подходящего целочисленного типа.

Пример

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

См. также

ckd_sub
(C23)
проверяемое вычитание двух целых чисел
(обобщённый по типу макрос функции)
ckd_mul
(C23)
проверяемое умножение двух целых чисел
(обобщённый по типу макрос функции)
Документация C++ для ckd_add

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/numeric/ckd_add

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API