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
lub0X
- binary: z prefiksem
0b
lub0B
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
, ,uint
long
,ulong
.Uwaga
Literały są interpretowane jako wartości dodatnie. Na przykład literał
0xFF_FF_FF_FF
reprezentuje liczbę4294967295
uint
typu, choć ma taką samą reprezentację bitów jak liczba-1
int
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ładunchecked((int)0xFF_FF_FF_FF)
tworzy wartość-1
.Jeśli literał ma sufiks
U
lubu
, 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
lubl
, 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ż literal
może być mylona z cyfrą1
. Użyj funkcjiL
w celu zachowania przejrzystości.Jeśli literał jest sufiksowany przez
UL
, ,Lu
LU
Ul
ul
lU
uL
lublu
, 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
, , uint
byte
ushort
ulong
short
nint
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
MinValue
nint
statycznych iMaxValue
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:
- Dla
nint
elementu : Int32.MinValue do Int32.MaxValue. - Dla
nuint
elementu : UInt32.MinValue do UInt32.MaxValue.
- Dla
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#:
- Typy całkowite
- Literały liczb całkowitych
- Typy całkowite o rozmiarze natywnym
- C# 11 — numeryczne
IntPtr
iUIntPtr