/fpcvt (浮動小数点数から整数への変換の互換性)

コンパイラが浮動小数点数型から整数型への変換を処理する方法を指定します。

構文

/fpcvt:IA
/fpcvt:BC

引数

/fpcvt:IA

/fpcvt:IA オプションは、結果が Intel AVX-512 変換命令と互換性を持つように浮動小数点値を整数に変換するよう、コンパイラに指示します。 この動作は、x86 ターゲットに対する Visual Studio 2019 の通常の動作です。

/fpcvt:BC

/fpcvt:BC オプションは、結果が Visual Studio 2017 以前のコンパイラと互換性を持つように浮動小数点値を符号なし整数に変換するよう、コンパイラに指示します。 これは、Visual Studio 2022 での既定の動作です。

解説

Visual Studio 2019 バージョン 16.8 以降のバージョンでは、/fpcvt コンパイラ オプションを使って、浮動小数点数から整数への変換の結果を制御できます。 /fpcvt:BC オプションは、Visual Studio 2022 の既定の動作を指定し、これは Visual Studio 2017 以前のバージョンの動作と同じです。 /fpcvt:IA オプションは、Intel Architecture (IA) AVX-512 変換命令の動作と互換性のある動作を指定します。 このオプションは、32 ビット x86 または 64 ビット x64 ターゲットで使用でき、/arch:AVX512 が指定されているかどうかにかかわらず適用されます。

Visual Studio 2019 の場合、x64 ターゲットの既定の動作は、/arch:AVX512 が指定されていない限り /fpcvt:BC と一致します。 通常、x86 ターゲットの動作は /fpcvt:IA と一致します。ただし、/arch:IA32/arch:SSE、または関数呼び出しの結果が符号なし整数に直接変換される場合を除きます。 /fpcvt を使用すると既定値がオーバーライドされるため、すべての変換はいずれのターゲットでも一貫して処理されます。 ARM および ARM64 ターゲットの変換の動作は、/fpcvt:BC または /fpcvt:IA と一致しません。

標準 C++ では、切り捨てられた浮動小数点値について、整数型で正確に表現できる場合は、整数型に変換したときにその値になる必要があると規定されています。 それ以外の場合は、どのような動作でも許可されます。 どちらの /fpcvt オプションも、標準 C++ に準拠しています。 唯一の違いは、無効なソース値に対して返される値です。

/fpcvt:IA オプションを指定すると、無効な変換からは 1 つの sentinel 値が返されます。これは、0 から最も遠い対象値です。 符号付き型への変換の場合、sentinel はその型の最小値です。 符号なし型では最大値が使用されます。 浮動小数点演算からは、無効な演算を示すために Not-a-Number (NaN) 値が返される場合があります。 そのインジケーターは、整数型への変換には適用されません。整数型には NaN 値はありません。 sentinel は NaN 値の代わりとして使用されますが、有効な変換の結果である場合もあります。

また、/fpcvt:BC オプションを指定すると、ソースが無効なときも、符号付き型への変換から最小値が返されます。 ただし、符号なし整数型への変換は、long long への変換に基づいて行われます。 値を unsigned int に変換するため、コンパイラは最初にそれを long long 型に変換します。 その後、コンパイラは結果を 32 ビットに切り捨てます。 値を unsigned long long に変換するため、long long に対して大きすぎる有効なソースの値は特殊なケースとして処理されます。 その他のすべての値は、最初に long long に変換された後、unsigned long long に再キャストされます。

/fpcvt オプションは、Visual Studio 2019 バージョン 16.8 で新しく追加されたものです。 コマンド ラインで複数の /fpcvt オプションを指定すると、後にあるオプションが優先され、コンパイラによって警告が生成されます。

変換に関する組み込み関数

グローバルに適用される /fpcvt オプションとは別に、特定の変換の動作を指定できます。 コンパイラにより、/fpcvt:IA と互換性のある変換に対して組み込みの sentinel 変換関数が提供されています。 詳しくは、sentinel 変換関数に関する記事をご覧ください。 コンパイラには、ARM または ARM64 ターゲット アーキテクチャでの変換と互換性のある飽和変換関数も用意されています。 詳しくは、飽和変換関数に関する記事をご覧ください。

コンパイラは、有効な変換を可能な限り高速に実行する組み込み変換関数もサポートしています。 これらの関数では、無効な変換に対して、任意の値が生成されたり、例外がスローされたりする可能性があります。 結果は、ターゲット プラットフォーム、コンパイラ オプション、コンテキストに依存します。 これらは、範囲チェックが済んでいる値、または無効な変換になる可能性がない方法で生成された値を処理する場合に便利です。 詳しくは、高速変換関数に関する記事をご覧ください。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  3. [追加オプション] プロパティを変更して、/fpcvt:IA または /fpcvt:BC を追加します。 [OK] を選択して変更を保存します。

このコンパイラ オプションをコードから設定するには

関連項目

MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文
高速変換関数
飽和変換関数
sentinel 変換関数