Spec-Zone.ru › C++

ckd_add

Определён в заголовочном файле <stdckdint.h>
template< class type1, class type2, class type3 >
bool ckd_add( type1* result, type2 a, type3 b );
(начиная с C++26)

Вычисляет сумму x + y и сохраняет результат в *result. Сложение выполняется так, как если бы оба операнда были представлены типом знакового целого числа с бесконечным диапазоном, а затем результат был преобразован из этого целочисленного типа в type1. Если значение, присвоенное *result, точно представляет математический результат операции, функция возвращает false. В противном случае она возвращает true. В этом случае значение, присвоенное *result, представляет собой математический результат операции, приведённый по модулю ширины *result.

Параметры

a, b - целочисленные значения
result - адрес, по которому следует сохранить результат

Возвращаемое значение

false, если значение, присвоенное *result, точно представляет математический результат сложения; в противном случае — true.

Примечание

Шаблон функции ckd_add имеет ту же семантику, что и соответствующий обобщённый по типу макрос с тем же именем, указанный в C23.

Каждый из типов type1, type2 и type3 является знаковым или беззнаковым целочисленным типом без квалификаторов cv.

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

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_stdckdint_h 202603L (C++26) Заголовок совместимости <stdckdint.h> для проверяемых целочисленных операций C

Пример

#include <cstdint>
#include <limits>
#include <print>
#include <stdckdint.h>

int main()
{
    const std::uint8_t x{14};
    std::uint16_t y{28}, result1{};
    bool overflow{};

    overflow = ckd_add(&result1, x, y);
    std::println("{} + {} => {} ({})", x, y, result1, overflow ? "Overflow" : "OK");

    y = std::numeric_limits<std::uint16_t>::max();
    overflow = ckd_add(&result1, x, y);
    std::println("{} + {} => {} ({})", x, y, result1, overflow ? "Overflow" : "OK");

    std::uint32_t result2{};
    overflow = ckd_add(&result2, x, y);
    std::println("{} + {} => {} ({})", x, y, result2, overflow ? "Overflow" : "OK");
}

Вывод:

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

Ссылки

  • Стандарт C++26 (ISO/IEC 14882:2026):
    • 29.11.2 Проверяемые целочисленные операции

См. также

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

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

Spec-Zone.ru

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