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 .
СодержаниеПараметры
Возвращаемое значениеfalse если значение, присвоенное * result корректно представляет математический результат умножения, true в противном случае. Примечание
Шаблон функции
Каждый из типов type1 , type2 и type3 является cv-неквалифицированным знаковым или беззнаковым целочисленным типом. Рекомендуется выводить диагностическое сообщение, если type2 или type3 не являются подходящими целочисленными типами, или если * result не является изменяемым lvalue подходящего целочисленного типа. ПримерЗапустить этот код #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)
Ссылки
Смотрите также
| ||||||||||||