При тех же двух входах и арифметической операции, которая приведет к переполнению, результат переполнения всегда будет одинаковым?
Просто для фона, я работаю в проекте Visual Studio C ++ с некоторыми причудливыми маленькими числами с плавающей запятой, пришедшими от некоторых гауссианов, передаваемых из Matlab через calllib, которые дают мне то, что выглядит как переполнение, когда показатель степени переходит к огромным числам в определенных местах эта матрица. Проблема в том, что когда я перезапускаю свой код, я все еще получаю переполнения, но в разных местах, что заставляет меня задуматься, насколько стабильно и детерминировано поведение переполнения.
Переполнение целых чисел со знаком неопределенное поведение; может случиться что угодно, даже такие вещи, как сбой вашей программы.
С практической точки зрения, когда компилятор создал вашу программу, он, вероятно, принял решение о некотором детерминированном поведении …
… однако, что вам действительно нужно беспокоиться, так это то, что компилятор определит некоторые Другой детерминированное поведение, если вы редактируете свою программу и компилируете ее снова, или вы изменяете параметры сборки и компилируете ее снова, или если вы обновляетесь до более новой версии и компилируете ее снова, или если вы пытаетесь использовать другой компилятор, или вы используете тот же функционировать в двух разных местах, и он решает выбрать различное поведение для каждого, и так далее.
Не могу ответить на это исчерпывающе, но подумал, что я продемонстрирую небольшой пример, который я сделал.
Итак, вот игрушечный пример, приготовленный в Visual Studio 2010
#include <climits>
#include <cfloat>
int _tmain( int argc , _TCHAR* argv[] )
{
// IS OVERFLOW DETERMINISTIC
int a = INT_MAX;
int b = a + 10;
std::cout <<"a=" << a << std::endl;
std::cout <<"b=a+1="<< b << std::endl;
double d1 = DBL_MAX ;
double d2 = 2*d1;
std::cout <<"d1=" << d1 << std::endl;
std::cout <<"d2=2*d2="<< d2 << std::endl;
return 0;
}
И вот несколько звонков в приложение …
C:\Users\me>cd/d C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug
C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF
C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF
C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF
C:\Users\me\Documents\Visual Studio 2010\Projects\TestSolution\Debug>TestSolution.exe
a=2147483647
b=a+10=-2147483639
d1=1.79769e+308
d2=2*d2=1.#INF