リテラル型と接尾辞
整数リテラルの接尾辞
特に特別な表記をしない場合、整数リテラルは int 型として解釈されます。整数リテラルを int 型以外の整数型の変数に代入すると、自動的に変数の型に合わせられます。例えば、整数リテラルを long 型の変数に代入すると、自動的にリテラルは long 型と判断されます。
ただし、整数リテラルは変数で表現できる値でなければなりません。byte 型の変数に整数リテラルを代入する場合、符号なし 8 ビットで表現できる 255 までの値でなければなりません。
class Test { static void Main() { byte byteValue = 255; short shortValue = 32767; uint uintValue = 4294967295; System.Console.WriteLine(byteValue); System.Console.WriteLine(shortValue); System.Console.WriteLine(uintValue); } }
このように、整数リテラルは自動的に要求された型に変換されます。
一方、整数リテラルに接尾辞を付加することで明示的にリテラルの型を指定できます。接尾辞は、リテラルの末尾に追加する文字です。
接尾辞 | リテラル型 |
---|---|
無し | int、uint、long、ulong のうち、表せる型 |
U, u | uint、ulong のうち、表せる型 |
L, l | long、ulong のうち、表せる型 |
UL, Ul, uL, ul, LU, Lu, lU, lu | ulong 型 |
小文字の l は 1 と読み違える可能性があるため、基本的に L を使うことを推奨します。接尾辞は、型を明示することで暗黙の変換を防ぎます。これは、符号が厳密に問われる処理などで重要になることがあります。
class Test { static void Main() { long longValue = 0x7FFFFFFFFFFFFFFFL; ulong ulongValue = 0xFFFFFFFFFFFFFFFFUL; System.Console.WriteLine(longValue); System.Console.WriteLine(ulongValue); } }
コード2は long 型及び ulong 型で表現できる最大値を変数に保存し、出力しています。整数リテラルの末尾に L 及び UL 接尾辞を付加していますが、整数リテラルは自動的に表せる方に合わせられるため、これらの接尾辞がなくてもコンパイルできます。
接尾辞を用いて整数リテラルの型を明示することで、自動的により小さい型に変換されることを防ぐことができます。
int x = 100U;
上記の変数宣言では整数リテラルに U 接尾辞が指定されているため、符号無し整数であると解釈されます。これに対して変数の型が符号付きの int 型であるため、明示的な変換なしではコンパイルエラーとなるでしょう。
実数リテラルと接尾辞
実数リテラルにも同様に接尾辞を指定することができます。 これも、整数型リテラルと考え方は同じです。
接尾辞 | リテラル型 |
---|---|
無し | double 型 |
F, f | float 型 |
D, d | double 型 |
M, m | decimal 型 |
実数リテラルは整数リテラルと異なり、自動的な変換は行われないことに注意してください。整数リテラルは接尾辞が指定されていなくても、表現できる範囲であれば自動的に変換されました。しかし、実数リテラルは常に double 型であると解釈されます。従って、実数リテラルを float に代入するには、F 接尾辞を明示的に指定する必要があります。
class Test { static void Main() { float floatValue = 0.02F; double doubleValue = 12.5D; decimal decimalValue = 234.63M; System.Console.WriteLine(floatValue); System.Console.WriteLine(doubleValue); System.Console.WriteLine(decimalValue); } }
コード3は接尾辞を指定しているため実数リテラルを各型に代入できますが、接尾辞を取り除くと double 型以外はエラーが出ることが確認できます。