Integrál numerikus típusok (C#-referencia)

Az integrál numerikus típusok egész számokat jelölnek. Minden integrál numerikus típus értéktípus. Az integráltípusok egyszerű típusok , és konstansokkal inicializálhatók. Minden integrál numerikus típus támogatja az aritmetikai, bitenkénti logikai, összehasonlítási és egyenlőségi operátorokat.

A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.

A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.

Jótanács

Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.

Az integráltípusok jellemzői

A C# az alábbi előre definiált integráltípusokat támogatja:

C# típus/kulcsszó Tartomány Méret .NET típusa
sbyte -128–127 Aláírt 8 bites egész szám System.SByte
byte 0–255 Aláíratlan 8 bites egész szám System.Byte
short -32 768–32 767 Aláírt 16 bites egész szám System.Int16
ushort 0–65 535 Aláíratlan 16 bites egész szám System.UInt16
int -2 147 483 648–2 147 483 647 Aláírt 32 bites egész szám System.Int32
uint 0–4 294 967 295 Aláíratlan 32 bites egész szám System.UInt32
long -9 223 372 036 854 775 808–9 223 372 036 854 775 807 Aláírt 64 bites egész szám System.Int64
ulong 0–18 446 744 073 709 551 615 Aláíratlan 64 bites egész szám System.UInt64
nint A platformtól függ (futásidőben számítva) Aláírt 32 bites vagy 64 bites egész szám System.IntPtr
nuint A platformtól függ (futásidőben számítva) Aláíratlan 32 bites vagy 64 bites egész szám System.UIntPtr

Az utolsó kettő kivételével az összes táblázatsorban a bal szélső oszlop minden C# típusú kulcsszója a megfelelő .NET típus aliasa. A kulcsszó és .NET típus neve felcserélhető. A következő deklarációk például azonos típusú változókat deklarálnak:

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

A táblázat utolsó két sorában lévő nint és nuint típusok natív méretű egész szám típusok. A környezetfüggő kulcsszavak segítségével nintnuintnatív méretű egész számokat definiálhat. A natív méretű egész számok 32 bites egész számok, amikor 32 bites folyamatban futnak, vagy 64 bites egész számok, amikor 64 bites folyamatban futnak. Használja őket interop-forgatókönyvekhez, alacsony szintű kódtárakhoz, és optimalizálja a teljesítményt olyan helyzetekben, ahol az egész számokat széles körben használják.

A natív méretű egész számok belsőleg System.IntPtr és System.UIntPtr .NET típusokként jelennek meg. A nint típusok a nuint mögöttes típusok aliasai.

Az egyes integráltípusok alapértelmezett értéke nulla, 0.

Minden egyes integráltípus rendelkezik MinValue olyan tulajdonságokkal és MaxValue tulajdonságokkal, amelyek az adott típus minimális és maximális értékét biztosítják. Ezek a tulajdonságok fordítási időállandók, kivéve a natív méretű (nint és nuint) típusokat. A MinValue és MaxValue tulajdonságok futásidőben kerülnek kiszámításra natív méretű típusok esetén. Ezeknek a típusoknak a mérete a folyamatbeállításoktól függ.

System.Numerics.BigInteger A struktúra használatával egy aláírt egész számot jelölhet felső vagy alsó határ nélkül.

Egész számkonstansok

Az egész számkonstansok a következők lehetnek:

  • decimális: előtag nélkül
  • hexadecimális: a 0x vagy 0X előtaggal
  • bináris: az 0b vagy 0B előtaggal

Az alábbi kód az egyes példákat mutatja be:

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

Az előző példa a _. A számjegyelválasztót sokféle numerikus literállal használhatja.

Az utótag az egész szám literáltípusát az alábbiak szerint határozza meg:

  • Ha a literálnak nincs utótagja, a fordító az alábbi típusok közül az elsőként rendeli hozzá a típust, amelyben az értéke megjeleníthető: int, uint, , longulong.

    Megjegyzés:

    A fordító a literálokat pozitív értékként értelmezi. A literál 0xFF_FF_FF_FF például a típus számát 4,294,967,295uint jelöli, bár a bitkép megegyezik a -1 típus számávalint. Ha egy bizonyos típusú értékre van szüksége, adjon meg egy literális értéket erre a típusra. Használja az unchecked operátort, ha egy literális érték nem jeleníthető meg a céltípusban. Például a következőt állítja előunchecked((int)0xFF_FF_FF_FF): -1 .

  • Ha a literál tartalmazza az utótagot vagy U az u utótagot, a fordító az alábbi típusok közül az elsőként rendeli hozzá a típust, amelyben az érték megjeleníthető: uint, ulong.

  • Ha a literál tartalmazza az utótagot vagy L az l utótagot, a fordító az alábbi típusok közül az elsőként rendeli hozzá a típust, amelyben az érték megjeleníthető: long, ulong.

    Megjegyzés:

    Utótagként használhatja a kisbetűt l . Azonban egy fordító figyelmeztetést generál, l mert a betű l összetéveszthető a számjegykel 1. Az egyértelműség kedvéért használja L .

  • Ha a literál az egyik UL, Ul, , uLul, LU, LulU, vagy lu utótagot tartalmazza, a fordító a típust ulonga következőképpen rendeli hozzá.

Ha egy egész számkonstans értéke meghaladja UInt64.MaxValueaz értéket, cs1021 fordítóhiba lép fel.

Ha a fordító meghatározza egy egész szám literáltípusát, int és a literál által képviselt érték a céltípus tartományán belül van, az érték implicit módon konvertálható a következővésbyte: , byte, , shortushort, uint, ulong, vagy nintnuint:

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

Ahogy az előző példa is mutatja, ha a literál értéke nem a céltípus tartományán belül van, cs0031-es fordítóhiba lép fel.

A leadással az egész számkonstans által képviselt értéket a konstans meghatározott típusától eltérő típussá alakíthatja:

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

Konverziók

Bármely integrál numerikus típust bármely más integrál numerikus típussá alakíthat át. Ha a céltípus a forrástípus összes értékét képes tárolni, az átalakítás implicit módon történik. Ellenkező esetben explicit átalakítást hajthat végre egy öntött kifejezéssel . További információ: Beépített numerikus konverziók.

Natív méretű egész számok

A natív méretű egész számok speciális viselkedésűek, mivel a tároló megegyezik a célgépen található természetes egész szám méretével.

  • Ha futásidőben szeretné lekérni egy natív méretű egész szám méretét, használja a következőt sizeof(): . A kódot azonban nem biztonságos környezetben kell lefordítani. Például:

    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
    

    A statikus IntPtr.Size és UIntPtr.Size a tulajdonságok egyenértékű értékét is lekérheti.

  • Ha futásidőben szeretné lekérni a natív méretű egész számok minimális és maximális értékeit, használja a MinValue és MaxValue statikus tulajdonságokat a nint és nuint kulcsszavakkal, ahogyan az alábbi példában is látható.

    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
    
  • Bár a teljes tartomány nint nagyobb lehet, nuint a fordítási idő állandói 32 bites tartományra korlátozódnak:

  • A fordító implicit és explicit konverziókat biztosít más numerikus típusokra. További információ: Beépített numerikus konverziók.

  • A natív méretű egész számok literáljaihoz nincs közvetlen szintaxis. Nincs utótag, amely jelzi, hogy egy literál natív méretű egész szám, mint például a L egy long jelez. Használjon implicit vagy explicit módon más egész számértékeket. Például:

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

C# nyelvspecifikáció

További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:

Lásd még