首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >警告C26451算术溢出:使用运算符'-‘

警告C26451算术溢出:使用运算符'-‘
EN

Stack Overflow用户
提问于 2020-11-10 19:40:04
回答 1查看 753关注 0票数 1

我不明白为什么这个问题会被标记出来:

代码语言:javascript
运行
复制
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));

该方法的定义是:

代码语言:javascript
运行
复制
InitAssignmentCell(int iRow, CString strAssignment, int iCheckState, LPARAM lParam)

最后一个参数是LPARAM。然而,我看到了一些诡计:

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

我不明白这一点,因为iNumRowsint类型的。

我已经看到了类似的答案here,我的直觉是,这是一个错误的警告。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-10 19:46:10

来自MSVC静态分析器的C26451警告是非常迂腐的。它警告您,您可能假设升级是在演员之前自动执行的(但它不是)。

若要使警告保持沉默,请在算术之前执行强制转换。因此,与其:

代码语言:javascript
运行
复制
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));

使用:

代码语言:javascript
运行
复制
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows) - 1L);

您并不真正需要L (或64位构建的LL )后缀,但它向未来的读者表明您知道自己在做什么。一个更精确(但丑陋)的常量规范将是static_cast<LPARAM>(1)

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

https://stackoverflow.com/questions/64775688

复制
相关文章

相似问题

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