Stories

Detail Return Return

C# 的內置數值轉換 - Stories Detail

C# 提供了一組整型和浮點數值類型。任何兩種數值類型之間都可以進行隱式或顯式轉換。顯式轉換必須使用強制轉換表達式來執行。

隱式數值轉換

下表顯示內置數值類型之間的預定義隱式轉換:

From
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 = 150;
    byte b = 300; // 警告 CS0031:常量值 “300” 無法轉換為 “byte”

    顯式數值轉換

    下表顯示不存在隱式轉換的內置數值類型之間的預定義顯式轉換:

    目標
    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 值。

Add a new Comments

Some HTML is okay.