別の浮動小数点型に変換された浮動小数点値では、元の値が結果の型で正確に表現できる場合、値が変更されることはありません。 元の値が数値であっても、正確に表現できない場合、結果は次に大きいまたは次に小さい表現可能な値のいずれかになります。 浮動小数点型の範囲については、「浮動小数点定数の制限」を参照してください。
整数型に変換される浮動小数点値は、まず小数値を破棄することによって切り捨てられます。 この切り捨てられた値が結果の型で表現できる場合、結果はその値である必要があります。 表現できない場合、結果の値は未定義になります。
Microsoft 固有の仕様
Microsoft コンパイラでは float
値に対して IEEE-754 binary32 表現が使用され、 long double
および double
に対して binary64 表現が使用されます。 long double
と double
では同じ表現が使用されているため、範囲と精度は同じです。
コンパイラは、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 へ変換、その後 long を char に変換します |
float |
short |
long へ変換、その後 long を short に変換します |
float |
int |
小数点で切り捨てます。 結果が int で表すには大きすぎる場合、結果は未定義になります。 |
float |
long |
小数点で切り捨てます。 結果が long で表すには大きすぎる場合、結果は未定義になります。 |
float |
long long |
小数点で切り捨てます。 結果が long long で表すには大きすぎる場合、結果は未定義になります。 |
float |
unsigned char |
long へ変換、その後 long を unsigned char に変換します |
float |
unsigned short |
long へ変換、その後 long を unsigned 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 double と double の表現は同じです。 |
double |
char |
float へ変換、その後 float を char に変換します |
double |
short |
float へ変換、その後 float を short に変換します |
double |
int |
小数点で切り捨てます。 結果が int で表すには大きすぎる場合、結果は未定義になります。 |
double |
long |
小数点で切り捨てます。 結果が long で表すには大きすぎる場合、結果は未定義になります。 |
double |
unsigned char |
long へ変換、その後 long を unsigned char に変換します |
double |
unsigned short |
long へ変換、その後 long を unsigned 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
からの変換と同じ方法に従います。