從浮點數類型的轉換
如果原始值在結果類型中完全可表示,則轉換成另一個浮點型別的浮點值不會變更值。 如果原始值是數值,但無法確切表示,則結果為下一個大於或下一個較低的可表示值。 如需浮點類型的範圍,請參閱 浮點常數 的限制。
轉換成整數類型的浮點值會先捨棄任何小數點值來截斷。 如果這個截斷的值在結果類型中是可表示的,結果必須是該值。 無法表示時,結果值是未定義的。
Microsoft 特定的
Microsoft編譯程式會針對 float
值使用 IEEE-754 binary32 表示法,以及 和 double
的 long double
binary64 表示法。 由於 long double
並使用 double
相同的表示法,所以它們具有相同的範圍和精確度。
當編譯程式將 或 long double
浮點數float
轉換成 double
時,它會根據浮點環境控件來四捨五入結果,該控件預設為「四捨五入至最接近,系結至偶數」。如果數值太高或太低而無法表示為數值float
,則轉換結果會根據原始值的正數或負無限大,如果啟用,則會引發溢位例外狀況。
轉換成小於 long
整數型別的結果是將值 long
轉換成 的結果,然後轉換成結果型別。
若要轉換為整數類型,至少與一樣大 long
,轉換結果類型中值太高或太低,可能會傳回下列任何值:
結果可能是 sentinel 值,這是最遠於零的可表示值。 對於帶正負號的類型,這是可表示值的最低值(0x800...0). 對於不帶正負號的類型,它是最高可表示的值(0xFF...F).
結果可能會 飽和,其中值太高而無法表示的值會轉換成最高的可表示值。 值太低而無法表示,會轉換成最低的可表示值。 這兩個值的其中一個也會當做 sentinel 值使用。
若要轉換成
unsigned long
或unsigned long long
,轉換超出範圍值的結果可能是一些值,而不是最高或最低可表示的值。 結果是否為 sentinel 或飽和值,取決於編譯程式選項和目標架構。 未來的編譯程式版本可能會改為傳回飽和或 sentinel 值。
END Microsoft 特定的
下表摘要說明從浮點類型進行轉換。
浮點類型的轉換數據表
從 | 至 | 方法 |
---|---|---|
float |
char |
long 轉換為 ,然後轉換成long char |
float |
short |
long 轉換為 ,然後轉換成long short |
float |
int |
於小數點截斷。 如果 result 太大而無法表示為 int ,則 result 未定義。 |
float |
long |
於小數點截斷。 如果 result 太大而無法表示為 long ,則 result 未定義。 |
float |
long long |
於小數點截斷。 如果 result 太大而無法表示為 long long ,則 result 未定義。 |
float |
unsigned char |
long 轉換為 ,然後轉換成long unsigned char |
float |
unsigned short |
long 轉換為 ,然後轉換成long unsigned short |
float |
unsigned |
於小數點截斷。 如果 result 太大而無法表示為 unsigned ,則 result 未定義。 |
float |
unsigned long |
於小數點截斷。 如果 result 太大而無法表示為 unsigned long ,則 result 未定義。 |
float |
unsigned long long |
於小數點截斷。 如果 result 太大而無法表示為 unsigned long long ,則 result 未定義。 |
float |
double |
表示為 double 。 |
float |
long double |
表示為 long double 。 在 MSVC 中, long double 且 double 具有相同的表示法。 |
double |
char |
float 轉換為 ,然後轉換成float char |
double |
short |
float 轉換為 ,然後轉換成float short |
double |
int |
於小數點截斷。 如果 result 太大而無法表示為 int ,則 result 未定義。 |
double |
long |
於小數點截斷。 如果 result 太大而無法表示為 long ,則 result 未定義。 |
double |
unsigned char |
long 轉換為 ,然後轉換成long unsigned char |
double |
unsigned short |
long 轉換為 ,然後轉換成long unsigned short |
double |
unsigned |
於小數點截斷。 如果 result 太大而無法表示為 unsigned ,則 result 未定義。 |
double |
unsigned long |
於小數點截斷。 如果 result 太大而無法表示為 unsigned long ,則 result 未定義。 |
double |
unsigned long long |
於小數點截斷。 如果 result 太大而無法表示為 unsigned long long ,則 result 未定義。 |
double |
float |
表示為 float 。 double 如果值不能完全表示為 float ,就會遺失精確度。 |
double |
long double |
值 long double 會 double 視為 。 |
的 long double
轉換會遵循與 從 double
轉換相同的方法。