ckd_mul
Определён в заголовочном файле <stdckdint.h> | ||
|---|---|---|
#define ckd_mul( result, a, b ) /* implementation-defined */ // exposed interface: bool ckd_mul( 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 = 2;
y = 21;
overflow = ckd_mul(&result_uint16, x, y);
printf("%u * %u => %u (%s)\n", x, y, result_uint16, text(overflow));
x = 2;
y = UINT16_MAX;
overflow = ckd_mul(&result_uint16, x, y);
printf("%u * %u => %u (%s)\n", x, y, result_uint16, text(overflow));
x = 2;
y = UINT16_MAX;
overflow = ckd_mul(&result_uint32, x, y);
printf("%u * %u => %u (%s)\n", x, y, result_uint32, text(overflow));
}
Вывод:
2 * 21 => 42 (OK) 2 * 65535 => 65534 (Overflow) 2 * 65535 => 131070 (OK)
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.20.1 Макросы проверяемых целочисленных операций ckd_ (с. 311)
См. также
|
(C23) | операция проверяемого сложения двух целых чисел (обобщённый по типу макрос функции) |
|
(C23) | операция проверяемого вычитания двух целых чисел (обобщённый по типу макрос функции) |
Документация C++ для ckd_mul |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/numeric/ckd_mul