C# 參考 (內建數值轉換)

C# 提供一組 整數浮點 數數值型別。 任何兩個數數值型別之間有一個轉換,可以是隱含或明確。 您必須使用 轉換運算式 來執行明確轉換。

隱含數值轉換

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

寄件者 收件者
sbyte shortintlongfloatdoubledecimalnint
byte shortushortintuintlongulongfloatdoubledecimalnintnuint
short intlongfloatdouble 、 或 decimalnint
ushort intuintlongulongfloat 、、 double 、 或 nintdecimalnuint
int longfloatdoubledecimalnint
uint longulongfloatdouble 、 或 decimalnuint
long floatdoubledecimal
ulong floatdoubledecimal
float double
nint longfloatdoubledecimal
nuint ulongfloatdoubledecimal

注意

int 、、、 longulongnint 、 或 到 floatulonglongnint 、、 或 nuintdoublenuint 的隱含轉換可能會導致精確度遺失,但永遠不會遺失大小順序。 uint 其他隱含數值轉換永遠不會遺失任何資訊。

另請注意,

  • 任何 整數數數值型別 都會隱含轉換成任何 浮點數數值型別

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

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

  • 例如,類型 int 為 (的常數運算式值,如果值在目的類型範圍內,則整數常值) 可以隱含地轉換成 sbytebyteshortushortuint 、、 ulongnintnuint

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

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

明確數值轉換

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

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

注意

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

另請注意:

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

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

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

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

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

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

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

  • 當您將 或 double 轉換成 float 時,來源值會轉換成 decimal 表示,並視需要四捨五入 decimal 為 28 第 28 個小數位之後的最接近數位。 視來源值的值而定,可能會發生下列一種結果:

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

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

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

C# 語言規格

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

另請參閱