次の方法で共有


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

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

暗黙的な数値変換

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

より 移行先
sbyte shortintlongfloatdoubledecimal、または nint
バイト shortushortintuintlongulongfloatdoubledecimalnint、または nuint
短い intlongfloatdouble、または decimal、または nint
ushort する intuintlongulongfloatdouble、または decimalnint、または nuint
int longfloatdouble、または decimalnint
uint する longulongfloatdouble、または decimal、または 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# 言語仕様」の次のセクションを参照してください。

こちらも参照ください