內建數值轉換 (C# 參考)
C# 提供一組 整數和浮點數值型別。 任何兩個數值型別之間存在一個轉換,可以是隱含或明確。 您必須使用轉換運算式來執行明確轉換。
隱含數值轉換
下表顯示內建數值型別間預先定義的隱含數值轉換:
從 | 至 |
---|---|
sbyte | short 、int 、long 、float 、double 、decimal 或 nint 。 |
byte | short 、ushort 、int 、uint 、long 、ulong 、float 、double 、decimal 、nint 或 nuint 。 |
short | int 、long 、float 、double 或 decimal 或 nint |
ushort | int 、uint 、long 、ulong 、float 、double 或 decimal 、nint 或 nuint |
int | long 、float 、double 、decimal 或 nint |
uint | long 、ulong 、float 、double 或 decimal 或 nuint |
long | float 、double 或 decimal |
ulong | float 、double 或 decimal |
float | double |
nint | long 、float 、double 或 decimal |
nuint | ulong 、float 、double 或 decimal |
注意
從 int
、uint
、long
、ulong
、nint
或 nuint
到 float
以及從 long
、ulong
、nint
或 nuint
到 double
的隱含轉換可能會導致精確度遺失,但永遠不會遺失大小順序。 其他隱含數值轉換永遠不會遺失任何資訊。
另請注意
byte
和sbyte
型別沒有隱含轉換。 沒有來自double
與decimal
類型的隱含轉換。decimal
類型和float
或double
類型之間沒有隱含轉換。型別
int
常數運算式的值 (例如整數常值所代表的值) 可以轉換成sbyte
、byte
、short
、ushort
、uint
、ulong
、nint
或nuint
,前提是其在目的地型別的範圍內:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
如上述範例所示,如果常數的值不在目的地型別的範圍內,就會發生編譯器錯誤 CS0031。
明確數值轉換
下表顯示內建數值型別間預先定義的明確轉換不含有隱含轉換:
從 | 至 |
---|---|
sbyte | byte 、ushort 、uint 、ulong 或 nuint |
byte | sbyte |
short | sbyte 、byte 、ushort 、uint 、ulong 或 nuint |
ushort | sbyte 、byte 或 short |
int | sbyte 、byte 、short 、ushort 、uint 、ulong 或 nuint 。 |
uint | sbyte 、byte 、short 、ushort 、int 或 nint |
long | sbyte 、byte 、short 、ushort 、int 、uint 、ulong 、nint 或 nuint |
ulong | sbyte 、byte 、short 、ushort 、int 、uint 、long 、nint 或 nuint |
float | sbyte 、byte 、short 、ushort 、int 、uint 、long 、ulong 、decimal 、nint 或 nuint 。 |
double | sbyte 、byte 、short 、ushort 、int 、uint 、long 、ulong 、float 、decimal 、nint 或 nuint |
decimal | sbyte 、byte 、short 、ushort 、int 、uint 、long 、ulong 、float 、double 、nint 或 nuint |
nint | sbyte 、byte 、short 、ushort 、int 、uint 、ulong 或 nuint |
nuint | sbyte 、byte 、short 、ushort 、int 、uint 、long 或 nint |
注意
明確的數值轉換可能會導致資料遺失或擲回例外狀況,通常是 OverflowException。
另請注意:
將整數型別的值轉換為另一個整數型別時,結果取決於溢位檢查內容。 在已檢查的內容中,如果來源值在目標類型的範圍內,轉換將會成功。 否則會擲回 OverflowException。 在未檢查的内容中,轉換一律會成功,並依下列方式進行:
如果來源類型大於目的地類型,則透過捨棄其「額外」最有效位元來截斷來源值。 然後,結果將被視為目的地類型的值。
如果來源類型小於目的地類型,則來源值是符號延伸的或零延伸的,因此其大小與目的地類型相同。 如果來源類型具有符號,則使用符號延伸;如果來源類型是無符號的,則使用零延伸。 然後,結果將被視為目的地類型的值。
如果來源類型與目的地類型大小相同,則將來源值視為目的地類型的值。
當您將
decimal
值轉換為整數型別時,這個值會捨入到最接近整數值的零。 如果產生的整數值超出目的地類型的範圍,就會擲回 OverflowException。當您將
double
或float
值轉換為整數型別時,這個值會往零的方向捨入到最接近的整數值。 如果產生的整數值超出目的地型別的範圍,結果隨溢位檢查內容而異。 在已檢查的內容中會擲回 OverflowException,而在未經檢查的內容中,結果是目的地類型的未指定值。當您將
double
轉換成float
時,double
值會捨入到最接近float
值。 如果double
值太小或太大以致不符合float
型別,結果會是零或無限大。當您將
float
或double
轉換成decimal
時,來源值會轉換成decimal
表示,必要時捨入到最接近第 28 個小數位數後的數字。 視來源值的值而定,可能會發生下列一種結果:如果來源值太小無法以
decimal
表示,結果就會變成零。如果來源值是 NaN (不是數字)、無限大或太大,無法以
decimal
表示,就會擲回 OverflowException。
當您將
decimal
轉換成float
或double
時,來源值會各別捨入到最接近float
或double
值。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的下列幾節: