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