首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告C26451:算术溢出

警告C26451:算术溢出
EN

Stack Overflow用户
提问于 2019-05-05 19:51:44
回答 6查看 47.2K关注 0票数 27

如何解决这些警告?

代码语言:javascript
复制
// midiNote is a double as it is used in floating point equation
// v is int because that's informative that the function wants whole numbers
void setMidiNote(int v) { midiNote = v-48;  }

警告C26451算术溢出:对4字节值使用运算符'-‘,然后将结果转换为8字节值。在调用运算符“-”之前将值转换为更大的类型,以避免溢出(io.2)。

代码语言:javascript
复制
// input should be 0 to 10 integer, and dank will be odd integers only
// dank is a double, it is ultimately used in a floating point equation
void setDarkIntensity(int v) { dank = v * 2 + 1; }

警告C26451算术溢出:对4字节值使用运算符'*‘,然后将结果转换为8字节值。在调用运算符“*”之前将值转换为更大的类型,以避免溢出(io.2)。警告C26451算术溢出:对4字节值使用运算符“+”,然后将结果转换为8字节值。在调用运算符'+‘之前,将值转换为更大的类型,以避免溢出(io.2)。

EN

回答 6

Stack Overflow用户

发布于 2019-05-05 20:07:17

我相信这是VS2019中的一个bug。它不再在VS2022中被标记。

例如,这会产生警告。

代码语言:javascript
复制
double test2(int n)
{
     return 4.0 * (n - 1);
}

但这不是

代码语言:javascript
复制
int test2a(int n)
{
    return 4 * (n - 1);
}

然而,对于后者来说,出现未定义行为的风险要大得多。乘以4大大增加了UB的风险,因为一个非常大的n集将产生UB。有多棒?在第一个溢出的例子中,在大约40亿个可能值中,只有一个可能的n值。在第二阶段,大约有30亿n将超过/低于流量。为什么?因为如果每一个比添加0或乘1更复杂的表达式都被标记为可能溢出,则整数算术是不可能实现的。

可以说,要将警告设置为这么高,几乎所有对ints的算术操作都会受到警告。

这个答案显示了在VS 2019代码分析规则集编辑器中禁用此警告的一种方法。

警告C26454:算术溢出:'-‘操作在编译时产生负的无符号结果(io.5)

然而,微软( Microsoft ),从VS2022开始,不再对此生成C26451警告。它也没有出现在-Wall下。很明显他们看到光了。

票数 19
EN

Stack Overflow用户

发布于 2020-01-02 13:30:57

我通过查看一些Microsoft解决了这个问题,但您也可以将变量转换为long long类型(我知道,在顶部)。它帮我消除了错误。希望他们能尽快解决这个问题。

票数 3
EN

Stack Overflow用户

发布于 2020-05-02 16:57:42

通过将变量的类型更改为“无符号__int64”,消除了警告。这就是微软开发者社区的建议!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55995817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档