Namespaces
Variants

ckd_sub

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

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

Содержание

Параметры

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

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

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

Примечание

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

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

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

Пример

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

int main()
{
    int16_t result1{};
    constexpr std::int8_t x1{-2};
    constexpr std::int16_t y1{1};
    const bool underflow1{ckd_sub(&result1, x1, y1)};
    std::println("{} - {} == {} ({})", x1, y1, result1, underflow1 ? "Underflow" : "OK");

    int16_t result2{};
    constexpr std::int8_t x2{-2};
    constexpr std::int16_t y2{std::numeric_limits<std::int16_t>::max()};
    const bool underflow2{ckd_sub(&result2, x2, y2)};
    std::println("{} - {} == {} ({})", x2, y2, result2, underflow2 ? "Underflow" : "OK");

    int32_t result3{};
    constexpr std::int8_t x3{-2};
    constexpr std::int16_t y3{std::numeric_limits<std::int16_t>::max()};
    const bool underflow3{ckd_sub(&result3, x3, y3)};
    std::println("{} - {} == {} ({})", x3, y3, result3, underflow3 ? "Underflow" : "OK");
}

Результат:

-2 - 1 == -3 (OK)
-2 - 32767 == 32767 (Underflow)
-2 - 32767 == -32769 (OK)

Ссылки

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

Смотрите также

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