我有一个遗留代码执行有符号int与无符号int的减法,并将结果转换为一个浮点数。它给出了Visual Studio 6到2013年的预期结果。对于Visual Studio 2017(15.6.3),结果不是预期的结果。我将代码简化为:
unsigned int uint = 10;
signed int sint = 9;
signed int res = sint - uint;
float fres = static_cast<float>(sint - uint);
对于我测试过的所有VS,res值都是-1。对于VS 2013及之前,fres值为-1。对于VS 2017,fres值为4.29496730e+09,即UINT_MAX。我在这里发现,VS 2017中的fres结果是符合C++11标准的结果(如果我正确理解的话)。VS2017编译器不会对此发出任何警告。
我怎样才能检测到在我的代码库中发生的所有这样一个糟糕的减法?
使用
对于VC++,您应该根据以下来源打开编译器选项:
https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-4-c4245?view=msvc-160