警告 C26451 算术溢出:使用运算符“-”
Warning C26451 Arithmetic overflow: Using operator '-'
我不明白为什么要标记此问题:
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));
该方法的定义是:
InitAssignmentCell(int iRow, CString strAssignment, int iCheckState, LPARAM lParam)
所以最后一个参数是LPARAM
。但是我看到了一些曲线:
Warning C26451 Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2).
我不明白,因为 iNumRows
是 int
类型。
我看到了类似的答案 ,我的直觉是这是一个错误的警告。
来自 MSVC 静态分析器的 C26451 警告非常迂腐。它警告您可能假设升级是在 之前 自动执行的(事实并非如此)。
要消除警告,请在算术之前进行转换。所以,而不是:
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));
使用:
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows) - 1L);
您并不真的需要 L
(或 LL
对于 64 位版本)后缀,但它让未来的读者清楚地知道您知道自己在做什么。常量的更 精确 (但丑陋)的规范是 static_cast<LPARAM>(1)
.
我不明白为什么要标记此问题:
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));
该方法的定义是:
InitAssignmentCell(int iRow, CString strAssignment, int iCheckState, LPARAM lParam)
所以最后一个参数是LPARAM
。但是我看到了一些曲线:
Warning C26451 Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '-' to avoid overflow (io.2).
我不明白,因为 iNumRows
是 int
类型。
我看到了类似的答案
来自 MSVC 静态分析器的 C26451 警告非常迂腐。它警告您可能假设升级是在 之前 自动执行的(事实并非如此)。
要消除警告,请在算术之前进行转换。所以,而不是:
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));
使用:
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows) - 1L);
您并不真的需要 L
(或 LL
对于 64 位版本)后缀,但它让未来的读者清楚地知道您知道自己在做什么。常量的更 精确 (但丑陋)的规范是 static_cast<LPARAM>(1)
.