C++ 如何避免Microsoft C26451(算术溢出)警告

C++ 如何避免Microsoft C26451(算术溢出)警告,c++,visual-studio-2015,overflow,C++,Visual Studio 2015,Overflow,在我的示例中,如何编写代码防御Microsoft C26451(算术溢出)警告?我觉得这应该是微不足道的修复。太令人沮丧了 // Linear interpolation // target - the target point, 0.0 - 1.0 // x... - two values {X1} {X2} inline static double Linear(float target, double x1, double x2) {

在我的示例中,如何编写代码防御Microsoft C26451(算术溢出)警告?我觉得这应该是微不足道的修复。太令人沮丧了

    // Linear interpolation
    // target  - the target point, 0.0 - 1.0
    // x...    - two values {X1} {X2}
    inline static double Linear(float target, double x1, double x2) {
        return (target * x2) + ((1.0 - (double)target) * x1);
    }
我读了一遍,但似乎无法修复我的C26451警告:“算术溢出:对4字节的值使用运算符“-”,然后将结果转换为8字节的值。在调用运算符“-”之前将值转换为更宽的类型,以避免溢出(io.2)

我将如何删除警告


Microsoft文档对其编译错误没有真正的帮助。

编译器警告没有意义,较新的Visual Studio版本也没有给出相同的警告。我只会对此行禁用它:

inline static double Linear(double target, double x1, double x2) {
    #pragma warning( push )
    #pragma warning( disable : 26451 )
    return (target * x2) + ((1.0 - target) * x1);
    #pragma warning( pop )
}

您使用什么编译器选项来获取该警告?在VS2019中,我不使用
/W4
来获取该警告。旁注:在以下情况下,您不需要强制转换为
double
(1.0-(double)target)
。它将被隐式转换为
double
。@TedLyngmo VS2019,但我使用的是Visual Studio 2015工具集(v140)这应该与使用VS2015相同。我之所以提到VS2019,是因为您标记了问题VS2017。不过,您使用的编译器选项是什么?仅供参考:
target
will(should)在这两个地方都隐式转换为
double
,所以我想知道它为什么会抱怨。如果你像这样把
target
当作
double
,它还会抱怨吗?
内联静态双线性(double-target,double-x1,double-x2){return(target*x2)+(1.0-target)*x1;}
如果我没记错的话,这是一个Intellisense警告,而不是编译警告。该软件通常需要一段时间才能注意到您已经解决了问题哦,如果是Intellisense(而不是编译器)发出了@Iwonderwhatthisapido提到的警告,那就忽略它。我仍然会尝试将
target
作为
double
(跳过选角)但是。这是一种优雅的方式来压缩问题,目的是打包代码以传递给其他人。谢谢!