2016-06-30 2 views
0

Редактировать (ВАЖНО): Этот вопрос был более конкретным, чем вопрос, который был отмечен как дубликат. Это спрашивало, как это сделать с помощью логической функции. Но теперь я знаю, что это просто не работает. Этот вопрос показывает, что a + b = c может быть проверен только переполнением, если вы пишете if(c - b == a) и что нет независимого от оператора способа проверки.Обнаружение целочисленного переполнения с использованием оператора If

После переполнения произошло, вы не можете обнаружить его

-lorro

Я искал способ обнаружения целочисленное переполнение в C++ с использованием, если заявление.

Возможные псевдо-код:

#include <iostream> 
#include <...> 

using namespace std; 

bool isOverflow(...); 

int main() 
    { 
    int a = INT_MAX + 1; 

    if (isOverflow(...)) 
    { 
     cout << "Overflow" << endl; 
    } 
    else 
    { 
     cout << "No Overflow" << endl; 
    } 
    return 0; 
} 

bool isOverflow 
{ 
    ... 
} 

OK, чтобы быть честным, то это предпочтение псевдо-код не может работать, но я видел, этот вопрос задавали много раз и не нашли каких-либо полезных ответов. Это может потребовать unsigned или unsigned long long, хотя я не обязательно поощряю их использование.

EDIT:

Я хотел бы использовать его с умножением предложения с 3-мя числами:

a * a * b 

Я знаю, что есть pow функция в <math.h>, но это не по теме.

Я также знаю, что если я хочу точный int результат от pow Я хотел бы использовать:

int(pow(base, index) + 0.5) 
+1

http://en.cppreference.com/w/cpp/types/numeric_limits После переполнения произошло, вы не можете обнаружить его - то, что вы можете сделать, это иметь temp var с большей точностью, чтобы вычислить результат, а затем отбросить его, если он находится в numeric_limits. – lorro

+0

На этот вопрос так много ответов. Ниже приведен ответ с использованием целых чисел со знаком: http://stackoverflow.com/a/1514309/4082723 – 2501

ответ

0

Это зависит от того, какого рода операции, которую вы используете, и какие типы операндов.

например. если вы хотите обнаружить переполнение после добавления, и оба операнда представляют собой целые числа без знака, то произойдет переполнение, если результат будет меньше суммы обоих операндов.

bool overflow; 
if (a+b < a) 
    overflow = true; 
else 
    overflow = false; 

Для целых чисел, вы можете обратиться к превосходному сообщению here

+0

Я хотел бы использовать его на 3-разрядном предложении умножения: 'a * a * b'. Я был подозрительным, когда увидел ответ на ваш ответ. – FluorescentGreen5

+0

есть некоторые процессоры с флагом переполнения, но похоже, что с C++ не может быть доступен этот флаг. Я думаю, что лучший способ сделать это - сделать расчет в обратном порядке и посмотреть, получится ли у меня одинаковый стартовый номер. – FluorescentGreen5

+1

Другим вариантом для умножения двух 'uint32_t' 'является получение результата в uint64_t и проверка, если результат меньше 2^32. Для 3 умножений вы должны сначала использовать процедуру для 2 умножений, а затем одну и ту же процедуру для результата и 3-го значения. –