Как определить переполнение беззнакового целочисленного умножения?

Clang 3.4+ и GCC 5+ предлагают проверенные cpp встроенные арифметические cpp функции. Они предлагают очень cxx быстрое решение этой проблемы, особенно cpp по сравнению с проверками cpp безопасности с помощью битового cxx тестирования.

Для примера c++ в вопросе OP это будет работать integer-overflow следующим образом:

unsigned long b, c, c_test;
if (__builtin_umull_overflow(b, c, &c_test))
{
    // Returned non-zero: there has been an overflow
}
else
{
    // Return zero: there hasn't been an overflow
}

В документации c Clang не указано, содержит integer-overflow ли c_test результат переполнения, если integer-overflow произошло переполнение, но cpp в документации GCC говорится, что cxx это так. Учитывая, что эти cpp двое хотят быть __builtin -совместимыми, можно c с уверенностью предположить, что c Clang работает именно так.

Существует cxx __builtin для каждой арифметической c операции, которая может переполняться cxx (сложение, вычитание, умножение), со cxx знаковыми и беззнаковыми cpp вариантами, для размеров c int, длинных размеров и длинных c++ длинных размеров. Синтаксис c имени: __builtin_[us](operation)(l?l?)_overflow:

  • u для неподписанного или s для подписанного;
  • операция может быть одним из add, sub или mul;
  • отсутствие суффикса l означает, что операндами являются int; один l означает long; два l означают long long.

Таким образом, для cpp проверенного добавления длинных cpp целых чисел со знаком это c будет __builtin_saddl_overflow. Полный список можно cpp найти на Clang documentation page.

GCC 5+ и Clang cpp 3.8+ дополнительно предлагают cxx общие встроенные функции, которые cpp работают без указания типа c++ значений: __builtin_add_overflow, __builtin_sub_overflow и __builtin_mul_overflow. Они также c работают с типами меньше c int.

Встроенные функции ниже c того, что лучше всего подходит cxx для платформы. На x86 они c++ проверяют флаги переноса, переполнения c и подписи.

Файл cl.exe

Visual Studio не имеет прямых cpp аналогов. Для беззнаковых c сложений и вычитаний, включая cpp , вы сможете использовать cpp addcarry_uNN и subborrow_uNN (где NN - количество integer-overflow битов, например addcarry_u8 или subborrow_u64). Их cpp подпись немного тупая:

unsigned char _addcarry_u32(unsigned char c_in, unsigned int src1, unsigned int src2, unsigned int *sum);
unsigned char _subborrow_u32(unsigned char b_in, unsigned int src1, unsigned int src2, unsigned int *diff);

c_in / b_in - это integer-overflow флаг переноса / заимствования c на входе, а возвращаемое cpp значение - это перенос / заимствование cpp на выходе. Похоже, что у integer-overflow него нет эквивалентов для integer-overflow знаковых операций или умножения.

В cpp противном случае Clang для c Windows теперь готов к работе integer-overflow (достаточно для Chrome), так cxx что это тоже может быть вариантом.

c++

c

integer-overflow

2022-11-19T02:10:31+00:00
Вопросы с похожей тематикой, как у вопроса:

Как определить переполнение беззнакового целочисленного умножения?