C# には、 整数 型と 浮動小数点 型のセットが用意されています。 暗黙的または明示的のいずれかの 2 つの数値型の間に変換が存在します。 明示的な変換を実行するには、 キャスト式 を使用する必要があります。
暗黙的な数値変換
次の表は、組み込みの数値型間の定義済みの暗黙的な変換を示しています。
| より | 移行先 |
|---|---|
| sbyte |
short、 int、 long、 float、 double、 decimal、または nint |
| バイト |
short、 ushort、 int、 uint、 long、 ulong、 float、 double、 decimal、 nint、または nuint |
| 短い |
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 |
| 長い |
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 = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'前の例に示すように、定数値が変換先の型の範囲内にない場合は、コンパイラ エラー CS0031 が発生します。
明示的な数値変換
次の表は、暗黙的な変換がない組み込みの数値型間の定義済みの明示的 な変換を示しています。
| より | 移行先 |
|---|---|
| sbyte |
byte、ushort、uint、ulong、または nuint |
| バイト | sbyte |
| 短い |
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 |
| 長い |
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 |
| ダブル |
sbyte、 byte、 short、 ushort、 int、 uint、 long、 ulong、 float、 decimal、 nint、または nuint |
| 小数 |
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 が投げられます。 チェックされていないコンテキストでは、変換は常に成功し、次のように進みます。
ソースの種類が変換先の型よりも大きい場合は、その "余分な" 最上位ビットを破棄することで、ソース値が切り捨てられます。 結果は変換先の型の値として扱われます。
ソースの種類が変換先の型よりも小さい場合、変換元の値は、コピー先の型と同じサイズになるように、符号拡張またはゼロ拡張のいずれかになります。 署名拡張機能は、ソースの種類が署名されている場合に使用されます。ソース型が符号なしの場合は、0-extension が使用されます。 結果は変換先の型の値として扱われます。
ソースの種類がコピー先の型と同じサイズの場合、ソース値は変換先の型の値として扱われます。
decimal値を整数型に変換すると、この値は 0 に向かって最も近い整数値に丸められます。 結果の整数値が変換先の型の範囲外の場合は、 OverflowException がスローされます。doubleまたはfloat値を整数型に変換すると、この値は 0 に丸められ、最も近い整数値になります。 結果の整数値が変換先の型の範囲外にある場合、結果は オーバーフロー チェック コンテキストに依存します。 チェックされたコンテキストでは、 OverflowException がスローされますが、チェックされていないコンテキストでは、結果は変換先の型の未指定の値になります。doubleをfloatに変換すると、double値は最も近いfloat値に丸められます。double値が小さすぎるか大きすぎてfloat型に収まらない場合、結果は 0 または無限大になります。floatまたはdoubleをdecimalに変換すると、ソース値はdecimal表現に変換され、必要に応じて小数点以下 28 桁目より後の最も近い数値に丸められます。 ソース値の値によっては、次のいずれかの結果が発生する可能性があります。ソース値が小さすぎて
decimalとして表されていない場合、結果は 0 になります。ソース値が NaN (数値ではない)、無限大、または大きすぎて
decimalとして表されない場合は、 OverflowException がスローされます。
decimalをfloatまたはdoubleに変換すると、ソース値はそれぞれ最も近いfloatまたはdouble値に丸められます。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
こちらも参照ください
.NET