次の方法で共有


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

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

C# 言語リファレンスには、C# 言語の最新リリース バージョンが記載されています。 また、今後の言語リリースのパブリック プレビューの機能に関する初期ドキュメントも含まれています。

このドキュメントでは、言語の最後の 3 つのバージョンまたは現在のパブリック プレビューで最初に導入された機能を特定します。

ヒント

C# で機能が初めて導入された時期を確認するには、 C# 言語バージョン履歴に関する記事を参照してください。

暗黙的な数値変換

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

より 移行先
sbyte shortintlongfloatdoubledecimal、または nint
バイト shortushortintuintlongulongfloatdoubledecimalnint、または nuint
短い intlongfloatdoubledecimal、または nint
ushort する intuintlongulongfloatdoubledecimalnint、または nuint
int longfloatdoubledecimal、または nint
uint する longulongfloatdoubledecimal、または nuint
長い 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 が発生します。

明示的な数値変換

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

より 移行先
sbyte byteushortuintulong、または nuint
バイト sbyte
短い sbytebyteushortuintulong、または nuint
ushort する sbytebyte、または short
int sbytebyteshortushortuintulong、または nuint
uint する sbytebyteshortushortint、または nint
長い sbytebyteshortushortintuintulongnint、または nuint
ulong sbytebyteshortushortintuintlongnint、または nuint
float sbytebyteshortushortintuintlongulongdecimalnint、または nuint
ダブル sbytebyteshortushortintuintlongulongfloatdecimalnint、または nuint
小数 sbytebyteshortushortintuintlongulongfloatdoublenint、または nuint
nint sbytebyteshortushortintuintulong、または nuint
nuint sbytebyteshortushortintuintlong、または nint

明示的な数値変換では、データが失われたり、例外がスローされたりする可能性があります(通常は OverflowException

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

  • 整数型の値を別の整数型に変換する場合、結果は オーバーフロー チェック コンテキストに依存します。 チェックされたコンテキストでは、変換元の値が変換先の型の範囲内にある場合、変換は成功します。 それ以外の場合は、OverflowException が投げられます。 チェックされていないコンテキストでは、変換は常に成功し、次のように進みます。

    • ソースの種類が変換先の型よりも大きい場合は、その "余分な" 最上位ビットを破棄することで、ソース値が切り捨てられます。 結果は変換先の型の値として扱われます。
    • ソースの種類が変換先の型よりも小さい場合、変換元の値は、コピー先の型と同じサイズになるように、符号拡張またはゼロ拡張のいずれかになります。 署名拡張機能は、ソースの種類が署名されている場合に使用されます。ソース型が符号なしの場合は、0-extension が使用されます。 結果は変換先の型の値として扱われます。
    • ソースの種類がコピー先の型と同じサイズの場合、ソース値は変換先の型の値として扱われます。
  • decimal値を整数型に変換すると、この値は 0 に向かって最も近い整数値に丸められます。 結果の整数値が変換先の型の範囲外の場合は、 OverflowException がスローされます。

  • doubleまたはfloat値を整数型に変換すると、この値は 0 に向かって最も近い整数値に丸められます。 結果の整数値が変換先の型の範囲外にある場合、結果は オーバーフロー チェック コンテキストに依存します。 チェックされたコンテキストでは、 OverflowException がスローされますが、チェックされていないコンテキストでは、結果は変換先の型の未指定の値になります。

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

  • floatまたはdoubledecimalに変換すると、ソース値はdecimal表現に変換され、必要に応じて小数点以下 28 桁目より後の最も近い数値に丸められます。 ソース値の値によっては、次のいずれかの結果が発生する可能性があります。

    • ソース値が小さすぎて decimalとして表されていない場合、結果は 0 になります。
    • ソース値が NaN (数値ではない)、無限大、または大きすぎて decimalとして表されない場合は、 OverflowException がスローされます。
  • decimalfloatまたはdoubleに変換すると、ソース値はそれぞれ最も近いfloatまたはdouble値に丸められます。

C# 言語仕様

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

こちらも参照ください