Integrale numerieke typen (C#-verwijzing)
De integrale numerieke typen vertegenwoordigen gehele getallen. Alle integrale numerieke typen zijn waardetypen. Ze zijn ook eenvoudige typen en kunnen worden geïnitialiseerd met letterlijke gegevens. Alle integrale numerieke typen ondersteunen rekenkundige, bitgewijze logische, vergelijkings- en gelijkheidsoperatoren.
Kenmerken van de integrale typen
C# ondersteunt de volgende vooraf gedefinieerde integrale typen:
C#-type/trefwoord | Bereik | Tekengrootte | .NET-type |
---|---|---|---|
sbyte |
-128 tot 127 | Ondertekend 8-bits geheel getal | System.SByte |
byte |
0 tot 255 | Niet-ondertekend 8-bits geheel getal | System.Byte |
short |
-32.768 tot 32.767 | Ondertekend 16-bits geheel getal | System.Int16 |
ushort |
0 tot 65.535 | Niet-ondertekend 16-bits geheel getal | System.UInt16 |
int |
-2.147.483.648 tot 2.147.483.647 | Ondertekend 32-bits geheel getal | System.Int32 |
uint |
0 tot 4.294.967.295 | Niet-ondertekend 32-bits geheel getal | System.UInt32 |
long |
-9.223.372.036.854.775.808 tot 9.223.372.036.854.775.807 | Ondertekend 64-bits geheel getal | System.Int64 |
ulong |
0 tot 18.446.744.073.709.551.615 | Niet-ondertekend 64-bits geheel getal | System.UInt64 |
nint |
Afhankelijk van het platform (berekend tijdens runtime) | Ondertekend 32-bits of 64-bits geheel getal | System.IntPtr |
nuint |
Afhankelijk van het platform (berekend tijdens runtime) | Niet-ondertekend 32-bits of 64-bits geheel getal | System.UIntPtr |
In alle tabelrijen behalve de laatste twee is elk C#-type trefwoord uit de meest linkse kolom een alias voor het bijbehorende .NET-type. De naam van het trefwoord en het .NET-type zijn uitwisselbaar. De volgende declaraties declareren bijvoorbeeld variabelen van hetzelfde type:
int a = 123;
System.Int32 b = 123;
De nint
en nuint
typen in de laatste twee rijen van de tabel zijn gehele getallen van systeemeigen grootte. U kunt de nint
en nuint
contextuele trefwoorden gebruiken om gehele getallen van systeemeigen grootte te definiëren. Dit zijn 32-bits gehele getallen wanneer ze worden uitgevoerd in een 32-bits proces of 64-bits gehele getallen wanneer ze worden uitgevoerd in een 64-bits proces. Ze kunnen worden gebruikt voor interop-scenario's, bibliotheken op laag niveau en om de prestaties te optimaliseren in scenario's waarin berekeningen met gehele getallen uitgebreid worden gebruikt.
De typen gehele getallen van systeemeigen grootte worden intern weergegeven als de .NET-typen System.IntPtr en System.UIntPtr. Vanaf C# 11 zijn de nint
en nuint
typen aliassen voor de onderliggende typen.
De standaardwaarde van elk integraaltype is nul, 0
.
Elk van de integrale typen heeft MinValue
en MaxValue
eigenschappen die de minimum- en maximumwaarde van dat type bieden. Deze eigenschappen zijn compileertijdconstanten, met uitzondering van het geval van de typen van systeemeigen grootte (nint
en nuint
). De MinValue
eigenschappen en MaxValue
eigenschappen worden tijdens runtime berekend voor typen van systeemeigen grootte. De grootte van deze typen is afhankelijk van de procesinstellingen.
Gebruik de System.Numerics.BigInteger structuur om een ondertekend geheel getal zonder boven- of ondergrens weer te geven.
Letterlijke waarden voor gehele getallen
Letterlijke waarden voor gehele getallen kunnen zijn
- decimaal: zonder voorvoegsel
- hexadecimaal: met het
0x
of0X
voorvoegsel - binair: met het
0b
of0B
voorvoegsel
In de volgende code ziet u een voorbeeld van elk van deze code:
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
In het voorgaande voorbeeld ziet u ook het gebruik van _
als scheidingsteken voor cijfers. U kunt het scheidingsteken voor cijfers gebruiken met allerlei numerieke letterlijke waarden.
Het type letterlijke geheel getal wordt als volgt bepaald door het achtervoegsel:
Als de letterlijke waarde geen achtervoegsel heeft, is het type het eerste van de volgende typen waarin de waarde kan worden weergegeven:
int
,uint
, ,long
, .ulong
Notitie
Letterlijke waarden worden geïnterpreteerd als positieve waarden. De letterlijke waarde
0xFF_FF_FF_FF
vertegenwoordigt bijvoorbeeld het nummer4294967295
van hetuint
type, hoewel deze dezelfde bitweergave heeft als het nummer-1
van hetint
type. Als u een waarde van een bepaald type nodig hebt, cast dan een letterlijke waarde naar dat type. Gebruik deunchecked
operator als een letterlijke waarde niet kan worden weergegeven in het doeltype. Produceert-1
bijvoorbeeldunchecked((int)0xFF_FF_FF_FF)
.Als de letterlijke waarde is achtervoegsel of
u
U
, is het type de eerste van de volgende typen waarin de waarde ervan kan worden weergegeven:uint
,ulong
.Als de letterlijke waarde is achtervoegsel of
l
L
, is het type de eerste van de volgende typen waarin de waarde ervan kan worden weergegeven:long
,ulong
.Notitie
U kunt de kleine letter
l
als achtervoegsel gebruiken. Hiermee wordt echter een compilerwaarschuwing gegenereerd omdat de letterl
kan worden verward met het cijfer1
. GebruikL
dit voor duidelijkheid.Als de letterlijke tekst is achtervoegsel door , , , , ,
LU
Lu
,lU
oflu
, het type isulong
.ul
uL
Ul
UL
Als de waarde die wordt vertegenwoordigd door een letterlijk geheel getal groter is UInt64.MaxValue, treedt er een compilerfout CS1021 op.
Als het bepaald type van een letterlijk geheel getal is int
en de waarde die wordt vertegenwoordigd door de letterlijke waarde zich binnen het bereik van het doeltype bevindt, kan de waarde impliciet worden geconverteerd naar sbyte
, byte
, short
, ushort
, , uint
, of nint
ulong
nuint
:
byte a = 17;
byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Zoals in het voorgaande voorbeeld wordt weergegeven, treedt er een compilerfout CS0031 op als de waarde van de letterlijke waarde zich niet binnen het bereik van het doeltype bevindt.
U kunt ook een cast gebruiken om de waarde die wordt vertegenwoordigd door een letterlijk geheel getal te converteren naar het andere type dan het bepaald type van de letterlijke waarde:
var signedByte = (sbyte)42;
var longVariable = (long)42;
Conversies
U kunt elk integraal numeriek type converteren naar elk ander integraal numeriek type. Als het doeltype alle waarden van het brontype kan opslaan, is de conversie impliciet. Anders moet u een cast-expressie gebruiken om een expliciete conversie uit te voeren. Zie ingebouwde numerieke conversies voor meer informatie.
Systeemeigen gehele getallen
Systeemeigen typen gehele getallen hebben een speciaal gedrag omdat de opslag wordt bepaald door de natuurlijke gehele getalgrootte op de doelcomputer.
Als u de grootte van een geheel getal van systeemeigen grootte tijdens runtime wilt ophalen, kunt u gebruiken
sizeof()
. De code moet echter worden gecompileerd in een onveilige context. Voorbeeld: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
U kunt ook de equivalente waarde ophalen uit de statische IntPtr.Size en UIntPtr.Size eigenschappen.
Als u de minimum- en maximumwaarden van gehele getallen van systeemeigen grootte tijdens runtime wilt ophalen, gebruikt
MinValue
u enMaxValue
als statische eigenschappen met denint
ennuint
trefwoorden, zoals in het volgende voorbeeld: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
U kunt constante waarden in de volgende bereiken gebruiken:
- Voor
nint
: Int32.MinValue aan Int32.MaxValue. - Voor
nuint
: UInt32.MinValue aan UInt32.MaxValue.
- Voor
De compiler biedt impliciete en expliciete conversies naar andere numerieke typen. Zie ingebouwde numerieke conversies voor meer informatie.
Er is geen directe syntaxis voor letterlijke gehele getallen van systeemeigen grootte. Er is geen achtervoegsel om aan te geven dat een letterlijk geheel getal een systeemeigen geheel getal is, zoals
L
eenlong
. U kunt in plaats daarvan impliciete of expliciete casts van andere gehele getallen gebruiken. Voorbeeld:nint a = 42 nint a = (nint)42;
C#-taalspecificatie
Zie de volgende secties van de C#-taalspecificatie voor meer informatie:
- Integrale typen
- Letterlijke waarden voor gehele getallen
- Integrale typen van systeemeigen grootte
- C# 11 - Numeriek
IntPtr
enUIntPtr