これらの警告を解決するにはどうすればよいですか?
// 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)。
これはVS2019のバグだと思います
たとえば、これは警告を生成します
double test2(int n)
{
return 4.0 * (n - 1);
}
しかし、これはしません
int test2a(int n)
{
return 4 * (n - 1);
}
ただし、未定義の動作のリスクは後者の方がはるかに大きくなります。 nのはるかに大きなセットがUBを生成するため、4を掛けるとUBのリスクが大幅に増加します
間違いなく、intでのほとんどすべての算術演算が警告されることになる警告が設定されます。
この回答は、VS 2019のコード分析ルールセットエディターでこの警告を無効にする方法を示しています。
警告は、結果が(大きい)型に変換される前に、計算が元の(小さい)型をオーバーフローする可能性があることを示しています。最初のケースでは、v
がMIN_INT(-231)、減算がアンダーフローし、未定義の動作(大きな正の数である可能性が高い)になり、midiNote
に格納されます。警告を回避するには、まず大きなタイプに変換します。
midiNote = double(v) - 48;
2番目の例も同様です。
setMidiNote
はこの問題が発生する値で呼び出されないことがわかっていますが、compilerはこの警告を出さず、問題の可能性を警告します。
私はいくつかの Microsoft Docs を見て問題を解決しましたが、変数をlong long
型に変更することもできます(上にあります)。それは私のためにエラーを取り除きました。うまくいけば、彼らはすぐにこれに対処します。