整数数値型 (C# リファレンス)

"整数数値型" は、整数値を表します。 すべての整数数値型は、値の型です。 また、単純型でもあり、リテラルを使用して初期化することができます。 すべての整数数値型では、算術ビット論理比較等値演算子がサポートされています。

整数型の特性

C# では、次の定義済みの整数型がサポートされています。

C# 型/キーワード 範囲 サイズ .NET 型
sbyte -128 ~ 127 符号付き 8 ビット整数 System.SByte
byte 0 ~ 255 符号なし 8 ビット整数 System.Byte
short -32,768 ~ 32,767 符号付き 16 ビット整数 System.Int16
ushort 0 ~ 65,535 符号なし 16 ビット整数 System.UInt16
int -2,147,483,648 ~ 2,147,483,647 符号付き 32 ビット整数 System.Int32
uint 0 ~ 4,294,967,295 符号なし 32 ビット整数 System.UInt32
long -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 符号付き 64 ビット整数 System.Int64
ulong 0 ~ 18,446,744,073,709,551,615 符号なし 64 ビット整数 System.UInt64
nint プラットフォームに依存 (実行時に計算) 符号付き 32 ビットまたは 64 ビット整数 System.IntPtr
nuint プラットフォームに依存 (実行時に計算) 符号なし 32 ビットまたは 64 ビット整数 System.UIntPtr

最後の 2 つを除くすべてのテーブル行で、左端の列の各 C# 型キーワードは、対応する .NET 型の別名です。 キーワードと .NET 型の名前は交換可能です。 たとえば、次の宣言では、同じ型の変数が宣言されています。

int a = 123;
System.Int32 b = 123;

テーブルの最後の 2 行の nint 型と nuint 型は、ネイティブサイズの整数です。 C# 9.0 以降、nint キーワードと nuint キーワードを使用して、ネイティブサイズの整数を定義できます。 これらは、32 ビット プロセスで実行される場合は 32 ビット整数、64 ビット プロセスで実行される場合は 64 ビット整数です。 これらは、相互運用シナリオ、低レベル ライブラリ、および整数演算が多用されるシナリオでパフォーマンスを最適化するために使用できます。

ネイティブサイズの整数型は、.NET 型 System.IntPtr および System.UIntPtr として内部で表現されます。 C# 11 以降、nint 型と nuint 型は基になる型の別名です。

各整数型の既定値はゼロ (0) です。

各整数型には、その型の最小値と最大値を指定する MinValue プロパティと MaxValue プロパティがあります。 これらのプロパティは、ネイティブサイズの型 (nint および nuint) のケースを除き、コンパイル時の定数です。 MinValue プロパティと MaxValue プロパティは、ネイティブサイズの型に対して実行時に計算されます。 これらの型のサイズは、プロセッサの設定によって異なります。

System.Numerics.BigInteger 構造体を使用して、上限や下限のない符号付き整数を表します。

整数リテラル

次の整数リテラルがあります。

  • "10 進": プレフィックスなし
  • "16 進": 0x または 0X プレフィックスを使用します
  • "バイナリ": 0b または 0B プレフィックスを使用します (C# 7.0 以降で使用できます)

次のコードは、それぞれの例を示しています。

var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;

前述の例は、C# 7.0 以降でサポートされている "桁区切り記号" としての _ の使用法も示しています。 数字区切り記号は、あらゆる種類の数値リテラルで使用できます。

整数リテラルの型は、そのサフィックスによって次のように決まります。

  • サフィックスがないリテラルの型は、intuintlongulong の型のうちその値を表すことができる最初のものになります。

    注意

    リテラルは正の値として解釈されます。 たとえば、リテラル 0xFF_FF_FF_FF は、uint 型の数値 4294967295 を表しますが、そのビット表現は int 型の数値 -1 と同じになります。 特定の型の値が必要な場合は、リテラルをその型にキャストしてください。 リテラル値をターゲット型で表すことができない場合は、unchecked 演算子を使用します。 たとえば、unchecked((int)0xFF_FF_FF_FF) を使用すると、-1 が生成されます。

  • リテラルのサフィックスが U または u の場合、その型は、uintulong の型のうちその値を表すことができる最初のものになります。

  • リテラルのサフィックスが L または l の場合、その型は、longulong の型のうちその値を表すことができる最初のものになります。

    注意

    小文字の l はサフィックスとして使用できます。 ただし、文字の l は数字の 1 と混同しやすいため、コンパイラから警告が出されます。 わかりやすくするために L を使用してください。

  • リテラルのサフィックスが ULUluLulLULulU、または lu の場合、その型は ulong です。

整数リテラルで表される値が UInt64.MaxValue を超えると、コンパイル エラー CS1021 が発生します。

整数リテラルの決定された型が int で、リテラルで表される値が変換先の型の範囲内にある場合、値を暗黙的に sbytebyteshortushortuintulongnint、または nuint に変換できます。

byte a = 17;
byte b = 300;   // CS0031: Constant value '300' cannot be converted to a 'byte'

前の例で示したように、リテラルの値が変換先の型の範囲内にない場合、コンパイラ エラー CS0031 が発生します。

また、キャストを使用して、整数リテラルによって表される値を、指定された型のリテラル以外の型に変換することもできます。

var signedByte = (sbyte)42;
var longVariable = (long)42;

変換

任意の整数数値型を他の整数数値型に変換することができます。 変換先の型に変換元の型のすべての値を格納できる場合、変換は暗黙的に実行されます。 それ以外の場合は、キャスト式を使用して明示的な変換を実行する必要があります。 詳細については、「組み込みの数値変換」に関するページを参照してください。

ネイティブ サイズの整数

ネイティブ サイズの整数型には、ストレージがターゲット コンピューター上の自然な整数サイズによって決定されるため、特別な動作があります。

  • 実行時にネイティブサイズの整数のサイズを取得するには、sizeof() を使用できます。 ただし、コードを安全でないコンテキストでコンパイルする必要があります。 例:

    Console.WriteLine($"size of nint = {sizeof(nint)}");
    Console.WriteLine($"size of nuint = {sizeof(nuint)}");
    
    // output when run in a 64-bit process
    //size of nint = 8
    //size of nuint = 8
    
    // output when run in a 32-bit process
    //size of nint = 4
    //size of nuint = 4
    

    また、静的な IntPtr.Size および UIntPtr.Size プロパティから同等の値を取得することもできます。

  • 実行時にネイティブサイズの整数の最小値と最大値を取得するには、次の例のように、nint キーワードと nuint キーワードで、MinValueMaxValue を静的プロパティとして使用します。

    Console.WriteLine($"nint.MinValue = {nint.MinValue}");
    Console.WriteLine($"nint.MaxValue = {nint.MaxValue}");
    Console.WriteLine($"nuint.MinValue = {nuint.MinValue}");
    Console.WriteLine($"nuint.MaxValue = {nuint.MaxValue}");
    
    // output when run in a 64-bit process
    //nint.MinValue = -9223372036854775808
    //nint.MaxValue = 9223372036854775807
    //nuint.MinValue = 0
    //nuint.MaxValue = 18446744073709551615
    
    // output when run in a 32-bit process
    //nint.MinValue = -2147483648
    //nint.MaxValue = 2147483647
    //nuint.MinValue = 0
    //nuint.MaxValue = 4294967295
    
  • 次の範囲の定数値を使用できます。

  • コンパイラによって、他の数値型への暗黙的と明示的な変換が提供されます。 詳細については、「組み込みの数値変換」に関するページを参照してください。

  • ネイティブサイズの整数リテラルには、直接の構文がありません。 long を示す L など、リテラルがネイティブサイズの整数であることを示すサフィックスはありません。 代わりに、他の整数値の暗黙的または明示的なキャストを使用できます。 例:

    nint a = 42
    nint a = (nint)42;
    

C# 言語仕様

詳細については、「C# 言語仕様」の次のセクションを参照してください。

関連項目