Как определить переполнение беззнакового целочисленного умножения?
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
Как определить переполнение беззнакового целочисленного умножения?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.