Udostępnij za pomocą


Integralne typy numeryczne (dokumentacja C#)

Typy liczb całkowitych reprezentują liczby całkowite. Wszystkie typy liczb całkowitych są typami wartości. Typy całkowite są 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 32-bitowa bez znaku 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 64-bitowa liczba całkowita bez znaku System.UInt64
nint Zależy od platformy (obliczanej podczas działania) Podpisana 32-bitowa lub 64-bitowa liczba całkowita System.IntPtr
nuint Zależy od platformy (obliczanej podczas działania) 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 oraz nazwa 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. Można użyć kontekstowych słów kluczowych nint i nuint do zdefiniowania liczb całkowitych o rozmiarze natywnym. Liczby całkowite o rozmiarze natywnym są 32-bitowymi liczbami całkowitymi 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. Typy nint i nuint to aliasy dla typów bazowych.

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

Każdy z typów całkowitych ma właściwości MinValue 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.

Użyj struktury System.Numerics.BigInteger, aby reprezentować całkowitą liczbę ze znakiem bez górnego ani dolnego ograniczenia.

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.

Sufiks określa typ literału liczby całkowitej 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 / Notatka

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

  • Jeśli literał zawiera U sufiks 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ł zawiera L sufiks lub l , jego typ jest pierwszym z następujących typów, w których można przedstawić jego wartość: long, ulong.

    Uwaga / Notatka

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

  • Jeśli literał zawiera jeden z sufiksów UL, , lULUUlulLuuLlu jest to .ulong

Jeśli wartość, jaką reprezentuje literał liczby całkowitej, przekracza UInt64.MaxValue, 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, , uintbyteushortulongshort, nintlub :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 inny typ niż typ określony dla 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 rozmiarze natywnym

Typy liczb całkowitych o rozmiarze natywnym mają specjalne zachowanie, ponieważ magazyn pasuje do naturalnego rozmiaru całkowitego 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. 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.

  • pl-PL: Aby uzyskać minimalne i maksymalne wartości liczb całkowitych o rozmiarze natywnym w czasie wykonywania, użyj właściwości statycznych MinValue i MaxValue z słowami kluczowymi nint i nuint, 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
    
  • Chociaż pełny zakres nint i nuint może być większy, stałe czasu kompilacji są ograniczone do zakresu 32-bitowego:

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

  • Nie istnieje bezpośrednia składnia dla 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. 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 także