当算术运算溢出时,它们会产生确定性数字吗?

When arithmetic operations overflow do they result in a deterministic figure?

给定相同的两个输入和一个会导致溢出的算术运算,溢出的结果是否总是相同?

仅作为背景,我在一个 Visual Studio C++ 项目中工作,其中一些时髦的小浮点数来自一些 Gaussians,通过 calllib 从 Matlab 传递过来,它们给我看起来像溢出的东西,其中指数在这个矩阵的某些地方跳到巨大的数字。问题是当我重新运行我的代码时,我仍然会溢出,但在不同的地方,这让我想知道溢出行为有多稳定和确定。

无法详尽地回答这个问题,但我想我会演示我制作的小例子。 所以这是在 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

有符号整数溢出是未定义的行为;任何事情都可能发生,甚至是您的程序崩溃之类的事情。

实际上,当编译器构建您的程序时,它可能会决定某些确定性行为...

... 但是,您真正需要担心的是,如果您编辑程序并再次编译,编译器将决定某些 other 确定性行为,或者您更改构建选项并再次编译它,或者如果您升级到较新的版本并再次编译它,或者如果您尝试使用不同的编译器,或者您在两个不同的地方使用相同的函数并且它决定选择不同的行为每一个,依此类推。