about_Numeric_Literals
Korte beschrijving
In dit artikel worden de syntaxis en het gebruik van numerieke waarden in PowerShell beschreven.
Lange beschrijving
Er zijn twee soorten numerieke letterlijke waarden: geheel getal en reëel. Beide kunnen type- en vermenigvuldigingsachtervoegsels hebben.
Letterlijke waarden voor gehele getallen
Letterlijke waarden voor gehele getallen kunnen worden geschreven in decimale, hexadecimale of binaire notatie.
Hexadecimale letterlijke waarden worden voorafgegaan door 0x
en binaire letterlijke waarden worden voorafgegaan door 0b
om ze te onderscheiden van decimale getallen.
Letterlijke waarden voor gehele getallen kunnen een typeachtervoegsel en een vermenigvuldigerachtervoegsel hebben.
Achtervoegsel | Betekenis | Notitie |
---|---|---|
y |
gegevenstype ondertekende byte | Toegevoegd in PowerShell 6.2 |
uy |
niet-ondertekend bytegegevenstype | Toegevoegd in PowerShell 6.2 |
s |
kort gegevenstype | Toegevoegd in PowerShell 6.2 |
us |
niet-ondertekend kort gegevenstype | Toegevoegd in PowerShell 6.2 |
l |
lang gegevenstype | |
u |
niet-ondertekend int of lang gegevenstype | Toegevoegd in PowerShell 6.2 |
ul |
niet-ondertekend lang gegevenstype | Toegevoegd in PowerShell 6.2 |
n |
BigInteger-gegevenstype | Toegevoegd in PowerShell 7.0 |
kb |
kilobyte vermenigvuldiger | |
mb |
megabyte vermenigvuldiger | |
gb |
gigabyte vermenigvuldiger | |
tb |
terabyte-vermenigvuldiger | |
pb |
petabyte-vermenigvuldiger |
Het type van een letterlijk geheel getal wordt bepaald door de waarde, het achtervoegsel van het type en het numerieke vermenigvuldigingsachtervoegsel.
Voor een letterlijk geheel getal zonder typeachtervoegsel:
- Als de waarde kan worden vertegenwoordigd door het type
[int]
, is dat het type. - Als de waarde anders kan worden vertegenwoordigd door het type
[long]
, is dat het type. - Als de waarde anders kan worden vertegenwoordigd door het type
[decimal]
, is dat het type. - Anders wordt deze vertegenwoordigd door het type
[double]
.
Voor een letterlijk geheel getal met een typeachtervoegsel:
- Als het achtervoegsel van het type is
u
en de waarde kan worden vertegenwoordigd door type[uint]
, is[uint]
het type . - Als het achtervoegsel van het type is
u
en de waarde kan worden vertegenwoordigd door type[ulong]
, is[ulong]
het type . - Als de waarde kan worden vertegenwoordigd door het opgegeven type, is dat het type.
- Anders is die letterlijke indeling onjuist.
Echte letterlijke waarden
Letterlijke waarden kunnen alleen in decimale notatie worden geschreven. Deze notatie kan breukwaarden bevatten na een decimaalteken en wetenschappelijke notatie met behulp van een exponentieel deel.
Het exponentiële deel bevat een 'e' gevolgd door een optioneel teken (+/-) en een getal dat de exponent vertegenwoordigt. De letterlijke waarde 1e2
is bijvoorbeeld gelijk aan de numerieke waarde 100.
Letterlijke waarden voor echte waarden kunnen een typeachtervoegsel en een vermenigvuldigingsachtervoegsel hebben.
Achtervoegsel | Betekenis |
---|---|
d |
decimaal gegevenstype |
kb |
kilobyte vermenigvuldiger |
mb |
megabyte vermenigvuldiger |
gb |
gigabyte vermenigvuldiger |
tb |
terabyte-vermenigvuldiger |
pb |
petabyte-vermenigvuldiger |
Er zijn twee soorten echte letterlijke waarden: dubbel en decimaal. Deze worden aangegeven door de afwezigheid of aanwezigheid van respectievelijk het achtervoegsel van het decimaaltype. PowerShell biedt geen ondersteuning voor een letterlijke weergave van een [float]
waarde. Een dubbele letterlijke waarde heeft het type [double]
. Een decimale letterlijke waarde heeft het type [decimal]
.
Volgnullen in het breukgedeelte van een letterlijke decimale waarde zijn significant.
Als de waarde van de cijfers van het exponent-deel in een [double]
reële letterlijke waarde kleiner is dan het ondersteunde minimum, is de waarde van die [double]
letterlijke reële waarde 0. Als de waarde van de cijfers van het exponent-deel in een [decimal]
werkelijke letterlijke waarde kleiner is dan het ondersteunde minimum, is die letterlijke waarde onjuist. Als de waarde van de cijfers van het exponent-deel in een [double]
of [decimal]
reële letterlijke waarde groter is dan het ondersteunde maximum, is die letterlijke waarde onjuist.
Notitie
De syntaxis maakt het mogelijk dat een double real literal een achtervoegsel van het lange type heeft.
PowerShell behandelt deze case als een letterlijk geheel getal waarvan de waarde wordt weergegeven door het type [long]
. Deze functie is behouden voor achterwaartse compatibiliteit met eerdere versies van PowerShell. Programmeurs worden echter afgeraden om letterlijke waarden voor gehele getallen van deze vorm te gebruiken, omdat ze gemakkelijk de werkelijke waarde van de letterlijke waarde kunnen verdoezelen. Heeft bijvoorbeeld 1.2L
de waarde 1, 1.2345e1L
heeft de waarde 12 en 1.2345e-5L
heeft de waarde 0, die niet direct duidelijk zijn.
Numerieke vermenigvuldigers
Voor het gemak kunnen letterlijke waarden voor gehele getallen en reële waarden een numerieke vermenigvuldigingswaarde bevatten, wat een van de meest gebruikte machten van 2 aangeeft. De numerieke vermenigvuldiger kan worden geschreven in elke combinatie van hoofdletters of kleine letters.
De vermenigvuldigerachtervoegsels kunnen worden gebruikt in combinatie met elk type achtervoegsels, maar moeten aanwezig zijn na het typeachtervoegsel. De letterlijke 100gbL
waarde is bijvoorbeeld ongeldig, maar de letterlijke 100Lgb
waarde is geldig.
Als een vermenigvuldiger een waarde maakt die groter is dan de mogelijke waarden voor het numerieke type dat het achtervoegsel opgeeft, is de letterlijke waarde onjuist ingedeeld. De letterlijke 1usgb
waarde is bijvoorbeeld onjuist ingedeeld, omdat de waarde 1gb
groter is dan is toegestaan voor het [ushort]
type dat is opgegeven door het us
achtervoegsel.
Voorbeelden van vermenigvuldigers
PS> 1kb
1024
PS> 1.30Dmb
1363148.80
PS> 0x10Gb
17179869184
PS> 1.4e23tb
1.5393162788864E+35
PS> 0x12Lpb
20266198323167232
Numerieke typeversnellers
PowerShell ondersteunt de volgende type accelerators:
Accelerator | Notitie | Description |
---|---|---|
[byte] |
Byte (niet-ondertekend) | |
[sbyte] |
Byte (ondertekend) | |
[Int16] |
16-bits geheel getal | |
[short] |
alias voor [int16] |
16-bits geheel getal |
[UInt16] |
16-bits geheel getal (niet-ondertekend) | |
[ushort] |
alias voor [uint16] |
16-bits geheel getal (niet-ondertekend) |
[Int32] |
32-bits geheel getal | |
[int] |
alias voor [int32] |
32-bits geheel getal |
[UInt32] |
32-bits geheel getal (niet ondertekend) | |
[uint] |
alias voor [uint32] |
32-bits geheel getal (niet-ondertekend) |
[Int64] |
64-bits geheel getal | |
[long] |
alias voor [int64] |
64-bits geheel getal |
[UInt64] |
64-bits geheel getal (niet ondertekend) | |
[ulong] |
alias voor [uint64] |
64-bits geheel getal (niet ondertekend) |
[bigint] |
Zie BigInteger Struct | |
[single] |
Drijvende komma met één precisie | |
[float] |
alias voor [single] |
Drijvende komma met één precisie |
[double] |
Dubbele precisie drijvende komma | |
[decimal] |
128-bits drijvende komma |
Notitie
De volgende typeversnellers zijn toegevoegd in PowerShell 6.2: [short]
, [ushort]
, [uint]
, . [ulong]
Voorbeelden
De volgende tabel bevat verschillende voorbeelden van numerieke letterlijke waarden en bevat het type en de waarde ervan:
Aantal | Type | Waarde |
---|---|---|
100 | Int32 | 100 |
100u | UInt32 | 100 |
100D | Decimaal | 100 |
100l | Int64 | 100 |
100uL | UInt64 | 100 |
100us | UInt16 | 100 |
100uy | Byte | 100 |
100 jaar | SByte | 100 |
1e2 | Dubbel | 100 |
1.e2 | Dubbel | 100 |
0x1e2 | Int32 | 482 |
0x1e2L | Int64 | 482 |
0x1e2D | Int32 | 7725 |
482D | Decimaal | 482 |
482gb | Int64 | 517543559168 |
482ngb | BigInteger | 517543559168 |
0x1e2lgb | Int64 | 517543559168 |
0b1011011 | Int32 | 91 |
0xFFFF's | Int16 | -1 |
0xFFFFFFFF | Int32 | -1 |
-0xffffffff | Int32 | 1 |
0xFFFFFFFFu | UInt32 | 4294967295 |
Werken met binaire of hexadecimale getallen
Te grote binaire of hexadecimale letterlijke waarden kunnen retourneren als [bigint]
in plaats van te parseren als en alleen als het n
achtervoegsel is opgegeven. Tekenbits worden nog steeds gerespecteerd boven even [decimal]
bereiken, maar:
- Als een binaire tekenreeks een veelvoud van 8 bits lang is, wordt de hoogste bit behandeld als de tekenbit.
- Als een hextekenreeks, die een veelvoud van 8 heeft, het eerste cijfer met 8 of hoger heeft, wordt het cijfer als negatief beschouwd.
Als u een niet-ondertekend achtervoegsel opgeeft voor binaire en hexe letterlijke waarden, worden tekenbits genegeerd. Retourneert 0xFFFFFFFF
-1
bijvoorbeeld , maar 0xFFFFFFFFu
retourneert de [uint]::MaxValue
van 4294967295.
Als u in PowerShell 7.1 een typeachtervoegsel gebruikt voor een hexentuele letterlijke waarde, wordt nu een ondertekende waarde van dat type geretourneerd. In PowerShell 7.0 retourneert de expressie 0xFFFFs
bijvoorbeeld een fout omdat de positieve waarde te groot is voor een [int16]
type.
PowerShell 7.1 interpreteert dit als -1
een [int16]
type.
Als u de letterlijke voorvoegsel met een 0
voorvoegt, wordt dit omzeild en wordt deze behandeld als niet-ondertekend.
Bijvoorbeeld: 0b011111111
. Dit kan nodig zijn bij het werken met letterlijke waarden in het [bigint]
bereik, omdat de u
achtervoegsels en n
niet kunnen worden gecombineerd.
U kunt binaire en hexe letterlijke waarden ook verwijderen met behulp van het -
voorvoegsel. Dit kan resulteren in een positief getal, omdat tekenbits zijn toegestaan.
Tekenbits worden geaccepteerd voor cijfers met BigInteger-achtervoegsels:
- BigInteger-suffixed hex behandelt de hoge bit van een letterlijke waarde met een lengte van 8 tekens als de tekenbit. De lengte bevat
0x
het voorvoegsel of eventuele achtervoegsels niet. - BigInteger-achtervoegsel binair accepteert tekenbits van 96 en 128 tekens, en elke 8 tekens erna.
Conversie van numerieke typen
Wanneer tekenreeksen worden geconverteerd naar getallen, worden aanvullende hexadecimale notatie-indicatoren ondersteund. Deze extra indelingen worden niet herkend als letterlijke waarden.
[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF
[int] '0b1111' -eq 0b1111
[int] '0b1111' -eq 15
Opdrachten die eruitzien als numerieke letterlijke waarden
Elke opdracht die eruitziet als een geldige numerieke letterlijke waarde, moet worden uitgevoerd met behulp van de aanroepoperator (&
), anders wordt deze geïnterpreteerd als een getal. Ongeldige letterlijke waarden met een geldige syntaxis, zoals 1usgb
, resulteren in de volgende fout:
PS> 1usgb
At line:1 char:6
+ 1usgb
+ ~
The numeric constant 1usgb is not valid.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant
Ongeldige letterlijke waarden met een ongeldige syntaxis 1gbus
worden echter geïnterpreteerd als een standaardtekenreeks en kunnen worden geïnterpreteerd als een geldige opdrachtnaam in contexten waar opdrachten kunnen worden aangeroepen.
Eigenschappen en methoden van numerieke objecten openen
Als u toegang wilt krijgen tot een lid van een numerieke letterlijke tekst, zijn er gevallen waarin u de letterlijke tussen haakjes moet omsluiten.
- De letterlijke waarde heeft geen decimaalteken
- De letterlijke waarde bevat geen cijfers achter de komma
- De letterlijke waarde heeft geen achtervoegsel
Het volgende voorbeeld mislukt bijvoorbeeld:
PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+ ~
An expression was expected after '('.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression
De volgende voorbeelden werken:
PS> 2uL.GetType().Name
UInt64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32
De eerste twee voorbeelden werken zonder dat de letterlijke waarde tussen haakjes wordt weergegeven, omdat de PowerShell-parser kan bepalen waar de numerieke letterlijke waarde eindigt en de methode GetType begint.
Hoe PowerShell numerieke letterlijke waarden parseert
PowerShell v7.0 heeft de manier gewijzigd waarop numerieke letterlijke waarden worden geparseerd om de nieuwe functies in te schakelen.
Echte numerieke letterlijke waarden parseren
Als de letterlijke een decimaalteken of de e-notatie bevat, wordt de letterlijke tekenreeks geparseerd als een reëel getal.
- Als het decimaal-achtervoegsel aanwezig is, gaat u rechtstreeks naar
[decimal]
. - Anders parseert u als
[Double]
en past u een vermenigvuldigingswaarde toe op de waarde. Controleer vervolgens de achtervoegsels van het type en probeer deze in het juiste type te zetten. - Als de tekenreeks geen typeachtervoegsel heeft, parseert u als
[Double]
.
Numerieke letterlijke waarden voor gehele getallen parseren
Letterlijke waarden van het type geheel getal worden geparseerd met behulp van de volgende stappen:
- De radix-indeling bepalen
- Voor binaire indelingen parseert u in
[BigInteger]
. - Voor hexadecimale notaties parseert u het
[BigInteger]
gebruik van speciale casies om het oorspronkelijke gedrag te behouden wanneer de waarde zich in het[int]
bereik of[long]
bevindt. - Indien binair noch hex, parseert u normaal als een
[BigInteger]
.
- Voor binaire indelingen parseert u in
- Pas de waarde van de vermenigvuldiger toe voordat u casts probeert om ervoor te zorgen dat typegrenzen op de juiste manier kunnen worden gecontroleerd zonder overloop.
- Controleer de achtervoegsels van het type.
- Controleer de typegrenzen en probeer te parseren in dat type.
- Als er geen achtervoegsel wordt gebruikt, wordt de waarde in de volgende volgorde ingecheckt, wat resulteert in de eerste geslaagde test die het type getal bepaalt.
[int]
[long]
[decimal]
(alleen letterlijke waarden basis-10)[double]
(alleen letterlijke waarden basis-10)
- Als de waarde buiten het
[long]
bereik voor hex- en binaire getallen valt, mislukt de parsering. - Als de waarde buiten het
[double]
bereik voor het getal basis 10 ligt, mislukt de parsering. - Hogere waarden moeten expliciet worden geschreven met behulp van het
n
achtervoegsel om de letterlijke waarde te parseren als eenBigInteger
.
Letterlijke waarden voor grote waarden parseren
Voorheen werden hogere gehele getallen geparseerd als het dubbele voordat ze naar een ander type werden gecast. Dit resulteert in een verlies van precisie in de hogere bereiken. Bijvoorbeeld:
PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904
Om dit probleem te voorkomen, moest u waarden schrijven als tekenreeksen en deze vervolgens converteren:
PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111
In PowerShell 7.0 moet u het N
achtervoegsel gebruiken.
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
Ook waarden tussen [ulong]::MaxValue
en [decimal]::MaxValue
moeten worden aangegeven met behulp van het decimaalachtervoegsel D
om de nauwkeurigheid te behouden. Zonder het achtervoegsel worden deze waarden geparseerd met [Double]
behulp van de real-parsing-modus.