組み込みの数値変換 (C# リファレンス)
C# では、整数数値型と浮動小数点数値型のセットを提供します。 任意の 2 つの数値型の間で、暗黙的または明示的のいずれかの変換が存在します。 明示的な変換を実行するには、キャスト式を使用する必要があります。
暗黙の数値変換
組み込みの数値型間の定義済みの暗黙的な変換を次の表に示します。
From | 終了 |
---|---|
sbyte | short 、int 、long 、float 、double 、decimal 、または nint |
byte | short 、ushort 、int 、uint 、long 、ulong 、float 、double 、decimal 、nint 、または nuint |
short | 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 |
long | 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 が発生します。
明示的な数値変換
次の表では、暗黙的な変換がない組み込みの数値型間で事前定義されている明示的変換を示しています。
From | 終了 |
---|---|
sbyte | byte 、ushort 、uint 、ulong 、または nuint |
byte | sbyte |
short | 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 |
long | 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 |
double | sbyte 、byte 、short 、ushort 、int 、uint 、long 、ulong 、float 、decimal 、nint 、または nuint |
decimal | 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)。
次の点にも注意してください。
ある整数型の値を別の整数型に変換するとき、その結果は、オーバーフロー チェック コンテキストによって変わります。 checked コンテキストでは、変換元の値が変換先の型の範囲内にあるとき、変換に成功します。 それ以外の場合は、OverflowException がスローされます。 unchecked コンテキストでは、変換は常に成功し、次のように続行されます。
変換元の型が変換先の型より大きい場合、変換元の値はその "余分な" 最上位ビットを破棄することで切り詰められます。 結果は変換先の型の値として扱われます。
変換元の型が変換先の型より小さい場合、変換元の値は変換先の型と同じサイズになるように、符号拡張またはゼロ拡張されます。 変換元の型に符号が付いている場合は符号拡張が利用され、符号が付いていない場合はゼロ拡張が利用されます。 結果は変換先の型の値として扱われます。
変換元の型が変換先の型と同じサイズの場合、変換元の値は変換先の型の値として扱われます。
decimal
値を整数型に変換するとき、この値は 0 方向に最も近い整数値に丸められます。 結果的に生成される整数値が変換先の型の範囲外になった場合、OverflowException がスローされます。double
またはfloat
値を整数型に変換するとき、この値は 0 方向に最も近い整数値に丸められます。 結果的に生成される整数値が変換先の型の範囲外になる場合、結果はオーバーフロー チェック コンテキストによって変わります。 チェック済みコンテキストの場合、OverflowException がスローされます。未チェック コンテキストの場合、結果は変換先の型の不特定な値になります。double
をfloat
に変換すると、double
値は最も近いfloat
値に丸められます。double
値が小さすぎるか、大きすぎてfloat
型に合わない場合、結果は 0 か無限になります。float
またはdouble
をdecimal
に変換するとき、変換元の値はdecimal
表現に変換され、必要に応じて、28 番目の小数位の後に最も近い数字に丸められます。 変換元の値によっては、結果は次のいずれかになります。変換元の値が小さすぎて
decimal
として表現できない場合、結果は 0 になります。変換元の値が NaN (Not a Number/数字ではない) か、無限か、大きすぎて
decimal
として表現できない場合、OverflowException がスローされます。
decimal
をfloat
またはdouble
に変換すると、変換元の値はそれぞれ最も近いfloat
またはdouble
値に丸められます。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
関連項目
.NET