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 The ckd_ checked integer operation macros (p: 311)
Смотрите также
(C23) |
проверяемая операция сложения двух целых чисел (типо-обобщённый макрос-функция) |
(C23) |
проверяемая операция вычитания двух целых чисел (типо-обобщённый макрос-функция) |
Документация C++ для ckd_mul
| |