整数除算式は、浮動小数点型に暗黙的にキャストされていました。
この除算は整数演算を使用して行われます。これにより、小数部は、浮動小数点の結果型に割り当てられる前に切り捨てられます。 このチェックは常にバグを示すとは限りません。場合によっては、切り捨てが意図的に行われるからです。
Visual Studio 2022 では、lnt-integer-float-division
チェックは、C/C++ コード スタイル オプションの [Truncated Division Result]\(切り捨てられた除算結果\) 設定によって制御されます。 この設定を変更する方法については、「リンターを構成する」を参照してください。
Visual Studio 2019 では、lnt-integer-float-division
チェックは、C/C++ コード スタイル オプションの [Integer division converted to floating point]\(整数除算から浮動小数点に変換\) 設定によって制御されます。 この設定を変更する方法については、「リンターを構成する」を参照してください。
例
float divide(int i, int j) {
return i / j; // Flagged: The integer division result is implicitly cast to float.
}
float half(int i) {
return i / 2; // Flagged: An integer literal is used.
}
問題を解決する方法
リンターによって提案される修正は、除算オペランドの 1 つを浮動小数点型に明示的にキャストするというものです。これにより、除算結果は切り捨てられなくなります。 キャストではなく、浮動小数点リテラルを使用することもできます。
float divide(int i, int j) {
return static_cast<float>(i) / j;
}
float half(int i) {
return i / 2.0;
}
注釈
切り捨てが意図的な場合は、警告を防ぐために明示的なキャストを追加できます。
float int_divide(int i, int j) {
return static_cast<float>(i / j); // Not flagged because of the explicit cast.
}