Integrální číselné typy (referenční dokumentace jazyka C#)
Celočíselné typy představují celočíselná čísla. Všechny integrální číselné typy jsou hodnotové typy. Jsou to také jednoduché typy a dají se inicializovat pomocí literálů. Všechny celočíselné číselné typy podporují aritmetické, bitové logické, porovnání a operátory rovnosti .
Charakteristiky integrálních typů
Jazyk C# podporuje následující předdefinované integrální typy:
Typ nebo klíčové slovo jazyka C# | Rozsah | Velikost | Typ .NET |
---|---|---|---|
sbyte |
-128 až 127 | Podepsané 8bitové celé číslo | System.SByte |
byte |
0 až 255 | Celé číslo bez znaménka | System.Byte |
short |
-32 768 až 32 767 | Podepsané 16bitové celé číslo | System.Int16 |
ushort |
0 až 65 535 | Celé číslo bez znaménka | System.UInt16 |
int |
-2 147 483 648 až 2 147 483 647 | Podepsané 32bitové celé číslo | System.Int32 |
uint |
0 až 4 294 967 295 | Celé číslo bez znaménka | System.UInt32 |
long |
-9 223 372 036 854 775 808 až 9 223 372 036 854 775 807 | Podepsané 64bitové celé číslo | System.Int64 |
ulong |
0 až 18 446 744 073 709 551 615 | Celé číslo bez znaménka | System.UInt64 |
nint |
Závisí na platformě (vypočítané za běhu) | Podepsané 32bitové nebo 64bitové celé číslo | System.IntPtr |
nuint |
Závisí na platformě (vypočítané za běhu) | 32bitové nebo 64bitové celé číslo bez znaménka | System.UIntPtr |
Ve všech řádcích tabulky s výjimkou posledních dvou je každé klíčové slovo typu jazyka C# z levého sloupce alias pro odpovídající typ .NET. Název klíčového slova a typu .NET jsou zaměnitelné. Například následující deklarace deklarují proměnné stejného typu:
int a = 123;
System.Int32 b = 123;
Typy nint
v nuint
posledních dvou řádcích tabulky jsou celá čísla v nativní velikosti. Pomocí kontextových nuint
klíčových slov můžete nint
definovat celá čísla nativní velikosti. Jedná se o 32bitová celá čísla při spuštění v 32bitovém procesu nebo 64bitových celých čísel při spuštění v 64bitovém procesu. Dají se použít pro scénáře spolupráce, knihovny nízké úrovně a pro optimalizaci výkonu ve scénářích, ve kterých se celočíselná matematika používá široce.
Celočíselné typy nativní velikosti jsou interně reprezentovány jako typy System.IntPtr .NET a System.UIntPtr. Počínaje jazykem C# 11 nint
jsou typy nuint
aliasy pro podkladové typy.
Výchozí hodnota každého celočíselného typu je nula, 0
.
Každý z integrálních typů má MinValue
a MaxValue
vlastnosti, které poskytují minimální a maximální hodnotu tohoto typu. Tyto vlastnosti jsou konstanty v čase kompilace s výjimkou případu nativních typů velikosti (nint
a nuint
). Vlastnosti MinValue
se MaxValue
počítají za běhu pro typy nativní velikosti. Velikosti těchto typů závisí na nastavení procesu.
System.Numerics.BigInteger Struktura slouží k reprezentaci signed integer bez horních nebo dolních hranic.
Celočíselné literály
Celočíselné literály můžou být
- decimal: bez předpony
- hexadecimální: s předponou nebo
0X
předponou0x
- binární: s předponou nebo
0B
předponou0b
Následující kód ukazuje příklad každého z nich:
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
Předchozí příklad také ukazuje použití _
jako oddělovač číslic. Oddělovač číslic můžete použít se všemi druhy číselných literálů.
Typ celočíselného literálu je určen příponou následujícím způsobem:
Pokud literál nemá příponu, jeho typ je první z následujících typů, ve kterých může být jeho hodnota reprezentována:
int
, ,uint
long
,ulong
.Poznámka:
Literály jsou interpretovány jako kladné hodnoty. Literál
0xFF_FF_FF_FF
například představuje číslo4294967295
uint
typu, i když má stejné bitové vyjádření jako číslo-1
int
typu. Pokud potřebujete hodnotu určitého typu, přetypování literálu na tento typ.unchecked
Operátor použijte, pokud hodnotu literálu nelze reprezentovat v cílovém typu. Napříkladunchecked((int)0xFF_FF_FF_FF)
vytvoří-1
.Pokud je literál příponou
U
nebou
, jeho typ je první z následujících typů, ve kterých může být jeho hodnota reprezentována:uint
,ulong
.Pokud je literál příponou
L
nebol
, jeho typ je první z následujících typů, ve kterých může být jeho hodnota reprezentována:long
,ulong
.Poznámka:
Malá písmena
l
můžete použít jako příponu. To však vygeneruje upozornění kompilátoru, protože písmenol
může být zaměňováno s číslicí1
. SloužíL
k přehlednosti.Pokud je literál příponou
UL
, ,Ul
,ul
uL
,LU
,Lu
lU
, nebolu
, jeho typ jeulong
.
Pokud hodnota reprezentovaná celočíselnou literál překročí UInt64.MaxValue, dojde k chybě kompilátoru CS1021 .
Pokud je určený typ celočíselného literálu int
a hodnota reprezentovaná literálem je v rozsahu cílového typu, může být hodnota implicitně převedena na sbyte
, , short
byte
, ushort
, uint
, , ulong
, nint
nebo nuint
:
byte a = 17;
byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Jak ukazuje předchozí příklad, pokud hodnota literálu není v rozsahu cílového typu, dojde k chybě kompilátoru CS0031 .
Pomocí přetypování můžete také převést hodnotu reprezentovanou celočíselnou literálou na jiný typ než určený typ literálu:
var signedByte = (sbyte)42;
var longVariable = (long)42;
Převody
Jakýkoli celočíselný číselný typ můžete převést na jakýkoli jiný celočíselný číselný typ. Pokud cílový typ může uložit všechny hodnoty zdrojového typu, převod je implicitní. V opačném případě je nutné k provedení explicitního převodu použít výraz přetypování. Další informace naleznete v tématu Předdefinované číselné převody.
Celá čísla s nativní velikostí
Nativní celočíselné typy mají zvláštní chování, protože úložiště je určeno přirozeným celočíselnou velikostí na cílovém počítači.
Pokud chcete získat velikost celočíselného čísla nativní velikosti za běhu, můžete použít
sizeof()
. Kód však musí být zkompilován v nebezpečném kontextu. Příklad: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
Ekvivalentní hodnotu můžete získat také ze statických IntPtr.Size vlastností a UIntPtr.Size vlastností.
Chcete-li získat minimální a maximální hodnoty celých čísel nativní velikosti za běhu, použijte
MinValue
aMaxValue
jako statické vlastnosti snint
klíčovýminuint
slovy, jak je znázorněno v následujícím příkladu: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
Konstantní hodnoty můžete použít v následujících oblastech:
- Pro
nint
: Int32.MinValue do Int32.MaxValue. - Pro
nuint
: UInt32.MinValue do UInt32.MaxValue.
- Pro
Kompilátor poskytuje implicitní a explicitní převody na jiné číselné typy. Další informace naleznete v tématu Předdefinované číselné převody.
Pro celočíselné literály v nativní velikosti neexistuje žádná přímá syntaxe. Neexistuje žádná přípona označující, že literál je celé číslo v nativní velikosti, například
L
označenílong
. Místo toho můžete použít implicitní nebo explicitní přetypování jiných celočíselné hodnoty. Příklad:nint a = 42 nint a = (nint)42;
specifikace jazyka C#
Další informace najdete v následujících částech specifikace jazyka C#:
- Celočíselné typy
- Celočíselné literály
- Integrální typy nativní velikosti
- C# 11 – číselné
IntPtr
aUIntPtr