Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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