Ответы с форумов MSDN

Проверка переполнения при арифметических операциях в C++

Date: 14.03.2018 5:58:41

Собственно, вы сами ответили: стандартного способа нет. Ваши проверки работают, но лучше бы использовать специальные функции компилятора для этих целей. Думаю, так быстрее будет (хотя, я не измерял), да и код получается более естественный.

В Visual Studio - функции из 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"); else printf("Error occured"); return 0; }

(Для использования операций со знаковыми числами нужно определить ENABLE_INTSAFE_SIGNED_FUNCTIONS перед включением заголовочного файла.)

Эти функции определены как inline, в зависимости от архитектуры процессора они используют либо intrinsic-функции компилятора, либо специальный алгоритм с разбиением операндов на 2 32-битных компонента, позволяющий отловить переполнение по значениям определенных битов. Можно открыть сам заголовочный файл и посмотреть.

В GCC - builtin-функции




Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub