組み込みの数値変換 (C# リファレンス)

C# では、整数数値型と浮動小数点数値型のセットを提供します。 任意の 2 つの数値型の間で、暗黙的または明示的のいずれかの変換が存在します。 明示的な変換を実行するには、キャスト式を使用する必要があります。

暗黙の数値変換

組み込みの数値型間の定義済みの暗黙的な変換を次の表に示します。

From 終了
sbyte shortintlongfloatdoubledecimal、または nint
byte shortushortintuintlongulongfloatdoubledecimalnint、または nuint
short intlongfloatdouble、または decimal、または nint
ushort intuintlongulongfloatdouble、または decimalnint、または nuint
int longfloatdouble、または decimalnint
uint longulongfloatdouble、または decimal、または nuint
long floatdouble、または decimal
ulong floatdouble、または decimal
float double
nint longfloatdouble、または decimal
nuint ulongfloatdouble、または decimal

注意

intuintlongulongnint、または nuint から float へ、および longulongnint、または nuint から double への暗黙的な変換では、精度が失われる可能性がありますが、桁違いに大きな損失が発生することはありません。 その他の暗黙的な数値変換では、情報が失われることはありません。

次の点にも注意してください。

  • 整数数値型はすべて、あらゆる浮動小数点数値型に暗黙的に変換できます。

  • byte および sbyte 型への暗黙的な変換はありません。 double および decimal 型からの暗黙的な変換はありません。

  • decimal 型と float 型または double 型の間に暗黙的な変換はありません。

  • int の定数式の値 (整数リテラルで表される値など) は、それが変換先の型の範囲内にある場合、sbytebyteshortushortuintulongnint、または nuint に暗黙的に変換できます。

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

    前の例で示したように、定数値が変換先の型の範囲内にない場合、コンパイラ エラー CS0031 が発生します。

明示的な数値変換

次の表では、暗黙的な変換がない組み込みの数値型間で事前定義されている明示的変換を示しています。

From 終了
sbyte byteushortuintulong、または nuint
byte sbyte
short sbytebyteushortuintulong、または nuint
ushort sbytebyte、または short
int sbytebyteshortushortuintulong、または nuint
uint sbytebyteshortushortint、または nint
long sbytebyteshortushortintuintulongnint、または nuint
ulong sbytebyteshortushortintuintlongnint、または nuint
float sbytebyteshortushortintuintlongulongdecimalnint、または nuint
double sbytebyteshortushortintuintlongulongfloatdecimalnint、または nuint
decimal sbytebyteshortushortintuintlongulongfloatdoublenint、または nuint
nint sbytebyteshortushortintuintulong、または nuint
nuint sbytebyteshortushortintuintlong、または nint

注意

明示的な数値変換によって、データが失われたり、例外がスローされたりすることがあります (通常は OverflowException)。

次の点にも注意してください。

  • ある整数型の値を別の整数型に変換するとき、その結果は、オーバーフロー チェック コンテキストによって変わります。 checked コンテキストでは、変換元の値が変換先の型の範囲内にあるとき、変換に成功します。 それ以外の場合は、OverflowException がスローされます。 unchecked コンテキストでは、変換は常に成功し、次のように続行されます。

    • 変換元の型が変換先の型より大きい場合、変換元の値はその "余分な" 最上位ビットを破棄することで切り詰められます。 結果は変換先の型の値として扱われます。

    • 変換元の型が変換先の型より小さい場合、変換元の値は変換先の型と同じサイズになるように、符号拡張またはゼロ拡張されます。 変換元の型に符号が付いている場合は符号拡張が利用され、符号が付いていない場合はゼロ拡張が利用されます。 結果は変換先の型の値として扱われます。

    • 変換元の型が変換先の型と同じサイズの場合、変換元の値は変換先の型の値として扱われます。

  • decimal 値を整数型に変換するとき、この値は 0 方向に最も近い整数値に丸められます。 結果的に生成される整数値が変換先の型の範囲外になった場合、OverflowException がスローされます。

  • double または float 値を整数型に変換するとき、この値は 0 方向に最も近い整数値に丸められます。 結果的に生成される整数値が変換先の型の範囲外になる場合、結果はオーバーフロー チェック コンテキストによって変わります。 チェック済みコンテキストの場合、OverflowException がスローされます。未チェック コンテキストの場合、結果は変換先の型の不特定な値になります。

  • doublefloat に変換すると、double 値は最も近い float 値に丸められます。 double 値が小さすぎるか、大きすぎて float 型に合わない場合、結果は 0 か無限になります。

  • float または doubledecimal に変換するとき、変換元の値は decimal 表現に変換され、必要に応じて、28 番目の小数位の後に最も近い数字に丸められます。 変換元の値によっては、結果は次のいずれかになります。

    • 変換元の値が小さすぎて decimal として表現できない場合、結果は 0 になります。

    • 変換元の値が NaN (Not a Number/数字ではない) か、無限か、大きすぎて decimal として表現できない場合、OverflowException がスローされます。

  • decimalfloat または double に変換すると、変換元の値はそれぞれ最も近い float または double 値に丸められます。

C# 言語仕様

詳細については、「C# 言語仕様」の次のセクションを参照してください。

関連項目