內建的數值轉換 (c # 參考)

C # 提供一組 整數浮點 數數值型別。 任兩個數數值型別(隱含或明確)之間存在轉換。 您必須使用 cast 運算式 來執行明確的轉換。

隱含數值轉換

下表顯示內建數數值型別之間預先定義的隱含轉換:

寄件者 收件者
sbyte shortintlongfloatdoubledecimalnint
byte shortushortintuintlongulongfloatdoubledecimalnintnuint
short intlongfloatdouble 、或 decimalnint
ushort intuintlongulongfloatdouble 、或 decimalnintnuint
int longfloatdouble 或。 decimal``nint
uint longulongfloatdouble 、或 decimalnuint
long floatdoubledecimal
ulong floatdoubledecimal
float double
nint longfloatdoubledecimal
nuint ulongfloatdoubledecimal

注意

將、、、、、、、、、、或之間的隱含轉換 int uint long ulong nint nuint float longulong 可能會 nint nuint double 導致精確度遺失,但永遠不會遺失量值的順序。 其他的隱含數值轉換絕不會遺失任何資訊。

另請注意,

  • 任何 整數數數值型別 都可以隱含地轉換成任何 浮點數型別。

  • 和類型沒有隱含的轉換 byte sbyte 。 沒有來自 doubledecimal 類型的隱含轉換。

  • decimal 類型和 floatdouble 類型之間沒有隱含轉換。

  • 型別的常數運算式值 int (例如,整數常值所代表的值) 可以隱含地轉換成 sbyte 、、、、、、 byte short ushort uint ulong nintnuint ,如果它是在目的地類型的範圍內:

    byte a = 13;
    byte b = 300;  // CS0031: Constant value '300' cannot be converted to a 'byte'
    

    如先前的範例所示,如果常數值不在目的類型範圍內,就會發生編譯器錯誤 CS0031

明確數值轉換

下表顯示內建數數值型別(沒有 隱含轉換)之間的預先定義明確轉換:

寄件者 收件者
sbyte byteushortuint 、或 ulongnuint
byte sbyte
short sbytebyteushortuintulongnuint
ushort sbytebyteshort
int sbytebyteshortushortuintulongnuint
uint sbytebyteshortushortint
long sbytebyteshortushortintuintulongnintnuint
ulong sbytebyteshortushortintuintlongnintnuint
float sbytebyteshortushortintuintlongulongdecimalnintnuint
double sbytebyteshortushortintuintlong ulong float decimal nint 、、、、或 nuint
decimal sbytebyteshortushortintuintlong ulong float double nint 、、、、或 nuint
nint sbytebyteshortushortintuintulongnuint
nuint sbytebyteshortushortintuintlongnint

注意

明確的數值轉換可能會造成資料遺失或擲回例外狀況,通常是 OverflowException

另請注意,

  • 將整數型別的值轉換為另一個整數型別時,結果取決於溢位檢查內容。 在已檢查的內容中,如果來源值在目標類型的範圍內,轉換將會成功。 否則會擲回 OverflowException。 在未檢查的內容中,轉換一律會成功,並按照如下所示繼續進行:

    • 如果來源類型大於目的地類型,會藉由捨棄其「額外」最高有效位元,來截斷來源值。 然後會將結果視為目標類型的值。

    • 如果來源類型小於目的地類型,則來源值會是「簽章」或「零延伸」,使其大小與目的地類型相同。 如果來源類型帶正負號,則會使用正負號擴充;如果來源類型不帶正負號,則會使用零擴充。 然後會將結果視為目標類型的值。

    • 如果來源類型與目標類型的大小相同,則來源值將視為目標類型的值。

  • 當您將 decimal 值轉換為整數型別時,這個值會捨入到最接近整數值的零。 如果產生的整數值超出目的地類型的範圍,就會擲回 OverflowException

  • 當您將 doublefloat 值轉換為整數型別時,這個值會往零的方向捨入到最接近的整數值。 如果產生的整數值超出目的地類型的範圍,結果隨溢位檢查內容而異。 在已檢查的內容中會擲回 OverflowException,而在未經檢查的內容中,結果是目的地類型的未指定值。

  • 當您將 double 轉換成 float 時,double 值會捨入到最接近 float 值。 如果 double 值太小或太大而無法放入 float 類型中,則結果為零或無限大。

  • 當您將 floatdouble 轉換成 decimal 時,來源值會轉換成 decimal 表示,必要時捨入到最接近第 28 個小數位數後的數字。 視來源值的值而定,可能會發生下列一種結果:

    • 如果來源值太小無法以 decimal 表示,結果就會變成零。

    • 如果來源值是 NaN (不是數字)、無限大或太大,無法以 decimal 表示,就會擲回 OverflowException

  • 當您轉換 decimalfloat 或時 double ,來源值會分別四捨五入為最接近或最接近的 float double 值。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

另請參閱