鉴于相同的两个输入和一个会导致溢出的算术运算,溢出的结果总是会一样吗?
仅仅是为了背景我正在一个Visual Studio C ++项目中工作,一些时髦的小浮点数来自一些高斯人通过calllib从Matlab传递给我的溢出,其中指数跳到了巨大的数字这个矩阵的某些地方。麻烦的是当我重新运行我的代码时,我仍然会遇到溢出,但是在不同的地方,这让我想知道稳定和确定性的溢出行为是如何。
答案 0 :(得分:1)
有符号整数的溢出是未定义的行为;任何事情都可能发生,即使你的程序崩溃也会发生。
实际上,当编译器构建你的程序时,它可能决定了一些确定性行为......
...但是,您真正需要担心的是,如果您编辑程序并再次编译它,或者您更改构建选项,编译器将决定某些其他确定性行为并再次编译,或者如果你升级到更新的版本并再次编译,或者如果你尝试使用不同的编译器,或者你在两个不同的地方使用相同的函数,它决定为每个版本选择不同的行为,并且等等。
答案 1 :(得分:0)
无法彻底回答这个问题,但我想我演示了我做的一个小例子。 所以这是在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