如何解决这些警告?
// 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)。
// 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)。
答案 0 :(得分:2)
警告告诉您,在转换为结果(较大)类型之前,您的计算可能会溢出原始(较小)类型。在第一种情况下,如果v
为MIN_INT(-2 31 ),则减法将下溢,从而导致未定义的行为(可能有很大的正数),然后将其存储在{{ 1}}。为避免警告,请先将其转换为较大的类型:
midiNote
同样地,您的第二个示例。
虽然您可以知道不会使用会出现此问题的值调用midiNote = double(v) - 48;
,但编译器却不知道并发出此警告来提醒您潜在的问题。
答案 1 :(得分:2)
我相信这是VS2019中的错误
例如,这会产生警告
double test2(int n)
{
return 4.0 * (n - 1);
}
但这不是
int test2a(int n)
{
return 4 * (n - 1);
}
但是,未定义行为的风险更大。乘以4会大大增加UB的风险,因为大量n会产生UB
可以说,要设置警告,实际上会警告对int进行任何算术运算。
此答案显示了一种在VS 2019中的代码分析规则集编辑器中禁用此警告的方法。
答案 2 :(得分:1)
我通过查看一些Microsoft Docs来解决了这个问题,但是您也可以将变量更改为long long
类型(在顶部,我知道)。它为我摆脱了错误。希望他们能尽快解决这个问题。
答案 3 :(得分:1)
通过将变量的类型更改为“ unsigned __int64”,我摆脱了警告。这就是Microsoft开发者社区的建议!
答案 4 :(得分:0)
要解决您的问题,请将参数 v 转换为 64 位类型:
void setMidiNote(int v) { midiNote = static_cast<int64_t>(v) - 48; }
void setDarkIntensity(int v) { dank = static_cast<int64_t>(v) * 2 + 1; }
在 VS 2019 16.9.6 上测试
来源:https://developercommunity.visualstudio.com/t/invalid-error-c26451/279594#T-N404080 https://docs.microsoft.com/en-us/cpp/code-quality/C26451