MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Можно ли на языках C/C++ определить целочисленное переполнение?"
Answer 797965
В Visual C++ можно использовать функции из Intsafe.h, например для умножения:
#include <stdlib.h> #include <stdio.h> #include <windows.h> #include <tchar.h> #include <Intsafe.h> int _tmain(int argc, _TCHAR* argv[]) { ULONGLONG a=100000000000, b=5000000000, c; HRESULT hr = ULongLongMult(a,b,&c); if(SUCCEEDED(hr)) printf("Result is %llu",c); else if(hr == INTSAFE_E_ARITHMETIC_OVERFLOW) printf("Overflow"); return 0; }
Данные функции определены как inline, и их реализация зависит от архитектуры. Функция ULongLongMult:
На 64-битных архитектурах использует intrinsic-функцию компилятора _umul128, поэтому должна быть довольно эффективной.
На 32-битных архитектурах использует специальный алгоритм расчета с разбиением чисел на 2 32-битных части (результат вычисляется по формуле
a.b * c.d = (a*c*2^64) + (a*d*2^32) + (b*c*2^32) + (b*d)
), и переполнение обнаруживается проверкой определенных битов в промежуточных результатах.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.