Spec-Zone.ru › C++

ckd_mul

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

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

Параметры

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

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

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

Примечание

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

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

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

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

Пример

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

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);
    std::println("{} * {} == {} ({})", x, y, result_uint16, overflow ? "Overflow" : "OK");

    x = 2;
    y = UINT16_MAX;
    overflow = ckd_mul(&result_uint16, x, y);
    std::println("{} * {} == {} ({})", x, y, result_uint16, overflow ? "Overflow" : "OK");

    x = 2;
    y = UINT16_MAX;
    overflow = ckd_mul(&result_uint32, x, y);
    std::println("{} * {} == {} ({})", x, y, result_uint32, overflow ? "Overflow" : "OK");
}

Вывод:

2 * 21 == 42 (OK)
2 * 65535 == 65534 (Overflow)
2 * 65535 == 131070 (OK)

Ссылки

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

См. также

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

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

Spec-Zone.ru

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