次の方法で共有


浮動小数点型からの変換

別の浮動小数点型に変換された浮動小数点値では、元の値が結果の型で正確に表現できる場合、値が変更されることはありません。 元の値が数値であっても、正確に表現できない場合、結果は次に大きいまたは次に小さい表現可能な値のいずれかになります。 浮動小数点型の範囲については、「浮動小数点定数の制限」を参照してください。

整数型に変換される浮動小数点値は、まず小数値を破棄することによって切り捨てられます。 この切り捨てられた値が結果の型で表現できる場合、結果はその値である必要があります。 表現できない場合、結果の値は未定義になります。

Microsoft 固有の仕様

Microsoft コンパイラでは float 値に対して IEEE-754 binary32 表現が使用され、 long double および double に対して binary64 表現が使用されます。 long doubledouble では同じ表現が使用されているため、範囲と精度は同じです。

コンパイラは、double または long double 浮動小数点数を float に変換するときに、浮動小数点環境コントロールに従って結果を丸めます。既定では、"近似値への丸めが行われます" になります。数値が大きすぎるか小さすぎて float 数値として表現できない場合、変換結果は、元の値の符号に従って正または負の無限大になり、オーバーフロー例外が発生します (有効になっている場合)。

long より小さい整数型への変換の結果は、その値を long に変換し、それから結果の型に変換した結果になります。

少なくとも long と同じ大きさの整数型に変換する場合、大きすぎるか小さすぎるために結果の型で表現できない値を変換すると、次のいずれかの値が返される可能性があります。

  • 結果は sentinel 値になる可能性があります。これは、0 から最も遠い表現可能な値です。 符号付きの型の場合、これは最小の表現可能な値 (0x800...0) です。 符号なしの型の場合、これは最大の表現可能な値 (0xFF...F) です。

  • 結果は飽和になる可能性があります。この場合、大きすぎて表現できない値が表現可能な最大の値に変換されます。 値が小さすぎて表現できない場合は、表現可能な最小の値に変換されます。 これら 2 つの値のいずれかが、sentinel 値としても使用されます。

  • unsigned long または unsigned long long への変換では、範囲外の値を変換した結果は、表現可能な最大または最小の値以外の値になる可能性があります。 結果が sentinel または飽和値であるかどうかは、コンパイラ オプションとターゲット アーキテクチャによって異なります。 将来のコンパイラ リリースでは、飽和または sentinel 値が代わりに返される可能性があります。

Microsoft 固有の仕様はここまで

次の表は、浮動小数点型から変換をまとめたものです。

浮動小数点型からの変換の表

From 終了 メソッド
float char long へ変換、その後 longchar に変換します
float short long へ変換、その後 longshort に変換します
float int 小数点で切り捨てます。 結果が int で表すには大きすぎる場合、結果は未定義になります。
float long 小数点で切り捨てます。 結果が long で表すには大きすぎる場合、結果は未定義になります。
float long long 小数点で切り捨てます。 結果が long long で表すには大きすぎる場合、結果は未定義になります。
float unsigned char long へ変換、その後 longunsigned char に変換します
float unsigned short long へ変換、その後 longunsigned short に変換します
float unsigned 小数点で切り捨てます。 結果が unsigned で表すには大きすぎる場合、結果は未定義になります。
float unsigned long 小数点で切り捨てます。 結果が unsigned long で表すには大きすぎる場合、結果は未定義になります。
float unsigned long long 小数点で切り捨てます。 結果が unsigned long long で表すには大きすぎる場合、結果は未定義になります。
float double double として表されます。
float long double long double として表されます。 MSVC では、long doubledouble の表現は同じです。
double char float へ変換、その後 floatchar に変換します
double short float へ変換、その後 floatshort に変換します
double int 小数点で切り捨てます。 結果が int で表すには大きすぎる場合、結果は未定義になります。
double long 小数点で切り捨てます。 結果が long で表すには大きすぎる場合、結果は未定義になります。
double unsigned char long へ変換、その後 longunsigned char に変換します
double unsigned short long へ変換、その後 longunsigned short に変換します
double unsigned 小数点で切り捨てます。 結果が unsigned で表すには大きすぎる場合、結果は未定義になります。
double unsigned long 小数点で切り捨てます。 結果が unsigned long で表すには大きすぎる場合、結果は未定義になります。
double unsigned long long 小数点で切り捨てます。 結果が unsigned long long で表すには大きすぎる場合、結果は未定義になります。
double float float として表されます。 double 値を float として正確に表すことができない場合、精度が低下します。
double long double long double 値は、 double として扱われます。

long double からの変換は double からの変換と同じ方法に従います。

関連項目

代入変換