Typy liczb całkowitych (odwołanie w C#)

Typy liczb całkowitych reprezentują liczby całkowite. Wszystkie typy liczb całkowitych są typami wartości. Są również prostymi typami i mogą być inicjowane literałami. Wszystkie typy liczb całkowitych obsługują operatory arytmetyczne, logiczne bitowe, porównania i równości .

Cechy typów całkowitych

Język C# obsługuje następujące wstępnie zdefiniowane typy całkowite:

Typ/słowo kluczowe języka C# Zakres Rozmiar Typ platformy .NET
sbyte -128 do 127 Podpisana 8-bitowa liczba całkowita System.SByte
byte Od 0 do 255 Niepodpisane 8-bitowe liczby całkowite System.Byte
short -32,768 do 32,767 Podpisana 16-bitowa liczba całkowita System.Int16
ushort Od 0 do 65 535 Niepodpisane 16-bitowe liczby całkowite System.UInt16
int -2,147,483,648 do 2,147,483,647 Podpisana 32-bitowa liczba całkowita System.Int32
uint od 0 do 4294 967 295 Liczba całkowita bez znaku 32-bitowego System.UInt32
long -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807 Podpisana 64-bitowa liczba całkowita System.Int64
ulong od 0 do 18,446,744,073,709,551,615 Liczba całkowita bez znaku 64-bitowego System.UInt64
nint Zależy od platformy (obliczanej w czasie wykonywania) Podpisana 32-bitowa lub 64-bitowa liczba całkowita System.IntPtr
nuint Zależy od platformy (obliczanej w czasie wykonywania) Liczba całkowita bez znaku 32-bitowego lub 64-bitowego System.UIntPtr

We wszystkich wierszach tabeli z wyjątkiem ostatnich dwóch, każde słowo kluczowe typu C# z lewej kolumny jest aliasem odpowiedniego typu .NET. Nazwa słowa kluczowego i typu .NET są zamienne. Na przykład następujące deklaracje deklarują zmienne tego samego typu:

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

Typy nint i nuint w dwóch ostatnich wierszach tabeli są liczbami całkowitymi o rozmiarze natywnym. Słowa kluczowe i kontekstowe umożliwiają nint zdefiniowanie liczb całkowitych o rozmiarze natywnym.nuint Są to 32-bitowe liczby całkowite podczas uruchamiania w procesie 32-bitowym lub 64-bitowych liczb całkowitych podczas uruchamiania w procesie 64-bitowym. Mogą być one używane w scenariuszach międzyoperacyjnych, bibliotekach niskiego poziomu i optymalizacji wydajności w scenariuszach, w których matematyczne liczby całkowite są szeroko używane.

Typy liczb całkowitych o rozmiarze natywnym są reprezentowane wewnętrznie jako typy System.IntPtr platformy .NET i System.UIntPtr. Począwszy od języka C# 11, nint typy i nuint są aliasami dla typów bazowych.

Wartość domyślna każdego typu całkowitego to zero, 0.

Każdy z typów całkowitych ma MinValue właściwości i MaxValue , które zapewniają minimalną i maksymalną wartość tego typu. Te właściwości są stałymi w czasie kompilacji, z wyjątkiem przypadków typów o rozmiarze natywnym (nint i nuint). Właściwości MinValue i MaxValue są obliczane w czasie wykonywania dla typów o rozmiarze natywnym. Rozmiary tych typów zależą od ustawień procesu.

System.Numerics.BigInteger Użyj struktury, aby reprezentować podpisaną liczbę całkowitą bez granic górnej lub dolnej.

Literały liczb całkowitych

Literały liczb całkowitych mogą być

  • dziesiętne: bez żadnego prefiksu
  • szesnastkowy: z prefiksem 0x lub 0X
  • binary: z prefiksem 0b lub 0B

Poniższy kod przedstawia przykład każdego z nich:

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

W poprzednim przykładzie pokazano również użycie jako _separatora cyfr. Separatora cyfr można używać ze wszystkimi rodzajami literałów liczbowych.

Typ literału liczby całkowitej jest określany przez jego sufiks w następujący sposób:

  • Jeśli literał nie ma sufiksu, jego typ jest pierwszym z następujących typów, w których można przedstawić jego wartość: int, , uintlong, ulong.

    Uwaga

    Literały są interpretowane jako wartości dodatnie. Na przykład literał 0xFF_FF_FF_FF reprezentuje liczbę 4294967295uint typu, choć ma taką samą reprezentację bitów jak liczba -1int typu. Jeśli potrzebujesz wartości określonego typu, rzutuj literał na ten typ. unchecked Użyj operatora , jeśli nie można przedstawić wartości literału w typie docelowym. Na przykład unchecked((int)0xFF_FF_FF_FF) tworzy wartość -1.

  • Jeśli literał ma sufiks U lub u, jego typ jest pierwszym z następujących typów, w których można przedstawić jego wartość: uint, ulong.

  • Jeśli literał ma sufiks L lub l, jego typ jest pierwszym z następujących typów, w których można przedstawić jego wartość: long, ulong.

    Uwaga

    Możesz użyć małej litery l jako sufiksu. Jednak powoduje to wygenerowanie ostrzeżenia kompilatora, ponieważ litera l może być mylona z cyfrą 1. Użyj funkcji L w celu zachowania przejrzystości.

  • Jeśli literał jest sufiksowany przez UL, , LuLUUlullUuLlub lu, jego typem jest .ulong

Jeśli wartość reprezentowana przez literał liczby całkowitej przekracza UInt64.MaxValuewartość , wystąpi błąd kompilatora CS1021 .

Jeśli określony typ literału liczby całkowitej jest int i wartość reprezentowana przez literał mieści się w zakresie typu docelowego, wartość może zostać niejawnie przekonwertowana na sbyte, , uintbyteushortulongshortnint lub :nuint

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

Jak pokazano w poprzednim przykładzie, jeśli wartość literału nie mieści się w zakresie typu docelowego, występuje błąd kompilatora CS0031 .

Można również użyć rzutowania, aby przekonwertować wartość reprezentowaną przez literał liczby całkowitej na typ inny niż określony typ literału:

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

Konwersje

Można przekonwertować dowolny typ liczbowy całkowity na dowolny inny typ liczbowy całkowity. Jeśli typ docelowy może przechowywać wszystkie wartości typu źródłowego, konwersja jest niejawna. W przeciwnym razie należy użyć wyrażenia rzutowania do przeprowadzenia jawnej konwersji. Aby uzyskać więcej informacji, zobacz Wbudowane konwersje liczbowe.

Liczby całkowite o wielkości natywnej

Typy liczb całkowitych o rozmiarze natywnym mają specjalne zachowanie, ponieważ magazyn jest określany przez naturalny rozmiar całkowity na maszynie docelowej.

  • Aby uzyskać rozmiar liczby całkowitej o rozmiarze natywnym w czasie wykonywania, możesz użyć polecenia sizeof(). Jednak kod musi zostać skompilowany w niebezpiecznym kontekście. Na przykład:

    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
    

    Możesz również uzyskać równoważną wartość ze statycznych IntPtr.Size i UIntPtr.Size właściwości.

  • Aby uzyskać minimalne i maksymalne wartości liczb całkowitych o rozmiarze natywnym w czasie wykonywania, użyj właściwości MinValuenint statycznych i MaxValue z słowami kluczowymi inuint, jak w poniższym przykładzie:

    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
    
  • Możesz użyć wartości stałych w następujących zakresach:

  • Kompilator udostępnia niejawne i jawne konwersje na inne typy liczbowe. Aby uzyskać więcej informacji, zobacz Wbudowane konwersje liczbowe.

  • Nie ma bezpośredniej składni literałów liczb całkowitych o rozmiarze natywnym. Nie ma sufiksu wskazującego, że literał jest liczbą całkowitą o wielkości natywnej, na przykład L wskazującą wartość long. Zamiast tego można użyć niejawnych lub jawnych rzutów innych wartości całkowitych. Na przykład:

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

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#:

Zobacz też