Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 vermenigvuldigerachtervoegsels hebben.
Letterlijke waarden voor gehele getallen
Letterlijke 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 deze te onderscheiden van decimale getallen.
Letterlijke waarden voor gehele getallen kunnen een typeachtervoegsel en een vermenigvuldigerachtervoegsel hebben.
| Achtervoegsel | Betekenis | Notitie |
|---|---|---|
y |
ondertekend bytegegevenstype | 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 |
kibibyte (10241) vermenigvuldiger | |
mb |
mebibyte (10242) vermenigvuldiger | |
gb |
gigibyte (10243) vermenigvuldiger | |
tb |
teribyte (10244) vermenigvuldiger | |
pb |
petibyte (10245) vermenigvuldiger |
Het type van een letterlijk geheel getal wordt bepaald door de waarde, het achtervoegsel van het type en het achtervoegsel van de numerieke vermenigvuldiger.
Voor een letterlijk geheel getal zonder typeachtervoegsel:
- Als de waarde kan worden vertegenwoordigd door het type
[int], is dat het bijbehorende type. - Als de waarde anders kan worden vertegenwoordigd door het type
[long], is dat het bijbehorende type. - Als de waarde anders kan worden vertegenwoordigd door het type
[decimal], is dat het bijbehorende type. - Anders wordt deze vertegenwoordigd door het type
[double].
Voor een letterlijk geheel getal met een typeachtervoegsel:
- Als het achtervoegsel van het type
uis en de waarde kan worden vertegenwoordigd door het type[uint], wordt het bijbehorende type[uint]. - Als het achtervoegsel van het type
uis en de waarde kan worden vertegenwoordigd door het type[ulong], wordt het bijbehorende type[ulong]. - Als de waarde ervan kan worden vertegenwoordigd door het opgegeven type, is dat het type.
- Anders is die letterlijke vorm onjuist.
Echte letterlijke gegevens
Echte letterlijke gegevens kunnen alleen worden geschreven in decimale notatie. 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 bijvoorbeeld gelijk is aan de numerieke waarde 100.
Echte letterlijke gegevens kunnen een typeachtervoegsel en een vermenigvuldigerachtervoegsel hebben.
| Achtervoegsel | Betekenis |
|---|---|
d |
Decimaal gegevenstype |
kb |
kibibyte (10241) vermenigvuldiger |
mb |
mebibyte (10242) vermenigvuldiger |
gb |
gigibyte (10243) vermenigvuldiger |
tb |
teribyte (10244) vermenigvuldiger |
pb |
petibyte (10245) vermenigvuldiger |
Er zijn twee soorten echte letterlijke waarden: dubbel en decimaal. Deze worden aangegeven door respectievelijk afwezigheid of aanwezigheid van het achtervoegsel van het decimaaltype. PowerShell biedt geen ondersteuning voor een letterlijke weergave van een [float] waarde. Een dubbele letterlijke tekst heeft type [double]. Een letterlijke letterlijke decimaalteken heeft het type [decimal].
Volgnullen in het breukgedeelte van een letterlijke decimaalteken zijn aanzienlijk.
Als de waarde van de cijfers van exponent-part in een [double] reële letterlijke waarde kleiner is dan het minimum, is de waarde van die [double] reële letterlijke waarde 0. Als de waarde van de cijfers van exponent-part in een [decimal] reële letterlijke waarde kleiner is dan de minimaal ondersteunde waarde, is die letterlijke waarde ongeldig. Als de waarde van de cijfers van exponent-part in een [double] of [decimal] werkelijke letterlijke waarde groter is dan het maximum dat wordt ondersteund, is die letterlijke waarde onjuist.
Notitie
Met de syntaxis kan een dubbele letterlijke letterlijke tekst een lang-type achtervoegsel hebben.
PowerShell behandelt dit geval als een letterlijk geheel getal waarvan de waarde wordt vertegenwoordigd door het type [long]. Deze functie is behouden voor achterwaartse compatibiliteit met eerdere versies van PowerShell. Programmeurs worden echter afgeraden om letterlijke gehele getallen van dit formulier te gebruiken, omdat ze de werkelijke waarde van de letterlijke waarde gemakkelijk kunnen verdoezelen.
1.2L heeft bijvoorbeeld de waarde 1, 1.2345e1L heeft waarde 12 en 1.2345e-5L de waarde 0 heeft, die niet direct duidelijk zijn.
Numerieke vermenigvuldigers
Voor het gemak kunnen gehele getallen en reële letterlijke waarden een numerieke vermenigvuldiger bevatten, wat een van een reeks veelgebruikte 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 typeachtervoegsel, maar moeten aanwezig zijn na het achtervoegsel van het type. De letterlijke 100gbL is bijvoorbeeld ongeldig, maar de letterlijke 100Lgb is geldig.
Als een vermenigvuldiger een waarde maakt die de mogelijke waarden voor het numerieke type overschrijdt dat door het achtervoegsel wordt opgegeven, is de letterlijke waarde ongeldig. De letterlijke 1usgb is bijvoorbeeld ongeldig 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 typeversnellers:
| Gaspedaal | Notitie | Beschrijving |
|---|---|---|
[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 een lijst met het type en de waarde:
| Getal | Type | Waarde |
|---|---|---|
| 100 | Int32 | 100 |
| 100u | UInt32 | 100 |
| 100D | Decimaal | 100 |
| 100l | Int64 | 100 |
| 100uL | UInt64 | 100 |
| 100us | UInt16 | 100 |
| 100uy | Byte | 100 |
| 100y | SByte | 100 |
| 1e2 | Dubbel | 100 |
| 1.e2 | Dubbel | 100 |
| 0x1e2 | Int32 | 482 |
| 0x1e2L | Int64 | 482 |
| 0x1e2D | Int32 | 7725 |
| 482D | Decimaal | 482 |
| 482gb | Int64 | 517543559168 |
| 482n gb | BigInteger | 517543559168 |
| 0x1e2lgb | Int64 | 517543559168 |
| 0b1011011 | Int32 | 91 |
| 0xFFFFs | 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 worden geretourneerd als [bigint] in plaats van het parseren te mislukken, als en alleen als het achtervoegsel n is opgegeven. Teken-bits worden nog steeds gerespecteerd boven zelfs [decimal] bereiken, maar:
- Als een binaire tekenreeks een veelvoud van 8 bits lang is, wordt de hoogste bit behandeld als de teken-bit.
- Als een hextekenreeks, die een lengte heeft die een veelvoud is van 8, het eerste cijfer met 8 of hoger heeft, wordt het numerieke getal beschouwd als negatief.
Als u een niet-ondertekend achtervoegsel op binaire en hex letterlijke tekens opgeeft, worden teken-bits genegeerd.
0xFFFFFFFF retourneert bijvoorbeeld -1, maar 0xFFFFFFFFu retourneert de [uint]::MaxValue van 4294967295.
In PowerShell 7.1 retourneert het gebruik van een typeachtervoegsel op een hex-letterlijke waarde nu een ondertekende waarde van dat type. In PowerShell 7.0 retourneert de expressie bijvoorbeeld 0xFFFFs een fout omdat de positieve waarde te groot is voor een [int16] type.
PowerShell 7.1 interpreteert dit als -1 dat een [int16] type is.
Als u het letterlijke voorvoegsel met een 0 voorvoegt, wordt dit overgeslagen en als niet-ondertekend behandeld.
Bijvoorbeeld: 0b011111111. Dit kan nodig zijn wanneer u met letterlijke gegevens in het [bigint] bereik werkt, omdat de u en n achtervoegsels niet kunnen worden gecombineerd.
U kunt ook binaire en hex letterlijke gegevens ontkenen met behulp van het - voorvoegsel. Dit kan resulteren in een positief getal omdat teken-bits zijn toegestaan.
Teken-bits worden geaccepteerd voor BigInteger-achtervoegsels met cijfers:
- BigInteger-achtervoegsel hex behandelt de hoge bit van elke letterlijke waarde met een lengte van 8 tekens als de teken-bit. De lengte bevat niet het
0xvoorvoegsel of eventuele achtervoegsels. - BigInteger-achtervoegsel binaire accepteert teken-bits met 96 en 128 tekens, en om de 8 tekens erna.
Conversie van numeriek type
Wanneer tekenreeksen worden geconverteerd naar getallen, worden aanvullende hexadecimale notatie-indicatoren ondersteund. Deze aanvullende indelingen worden niet herkend als letterlijke gegevens.
[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 tekens met ongeldige syntaxis, zoals 1gbus, worden echter geïnterpreteerd als een standaardbare tekenreeks en kunnen worden geïnterpreteerd als een geldige opdrachtnaam in contexten waarin opdrachten kunnen worden aangeroepen.
Eigenschappen en methoden van numerieke objecten openen
Als u toegang wilt krijgen tot een lid van een numerieke letterlijke waarde, zijn er gevallen waarin u de letterlijke waarde tussen haakjes moet insluiten.
- De letterlijke gegevens hebben geen decimaalteken
- De letterlijke notatie heeft geen cijfers na het decimaalteken
- De letterlijke 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 de letterlijke waarde tussen haakjes te plaatsen, omdat de PowerShell-parser kan bepalen waar de numerieke letterlijke waarde eindigt en de methode GetType wordt gestart.
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 waarde een decimaalteken of de e-notatie bevat, wordt de letterlijke tekenreeks geparseerd als een reëel getal.
- Als het decimaalachtervoegsel aanwezig is, dan rechtstreeks in
[decimal]. - Parseer anders als
[double]en pas vermenigvuldiger toe op de waarde. Controleer vervolgens de achtervoegsels van het type en probeer te casten naar het juiste type. - Als de tekenreeks geen typeachtervoegsel heeft, parseert u deze als
[double].
Numerieke letterlijke numerieke getallen parseren
Letterlijke waarden voor geheel getaltypen worden geparseerd met behulp van de volgende stappen:
- De radix-indeling bepalen
- Voor binaire indelingen kunt u parseren in
[bigint]. - Voor hexadecimale indelingen kunt u parseren in
[bigint]met behulp van speciale gevallen om oorspronkelijk gedrag te behouden wanneer de waarde zich in het[int]- of[long]bereik bevindt. - Als zowel binair als hex, parseert u normaal als een
[bigint].
- Voor binaire indelingen kunt u parseren in
- Pas de vermenigvuldigerwaarde toe voordat u casts uitvoert om ervoor te zorgen dat typegrenzen op de juiste wijze kunnen worden gecontroleerd zonder overloop.
- Controleer de achtervoegsels van het type.
- Controleer de typegrenzen en probeer het in dat type te parseren.
- Als er geen achtervoegsel wordt gebruikt, wordt de waarde ingecheckt in de volgende volgorde, wat resulteert in de eerste geslaagde test die het type van het getal bepaalt.
[int][long]-
[decimal](alleen letterlijke basis-10) -
[double](alleen letterlijke 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 een getal met grondtal 10 valt, mislukt de parsering. - Hogere waarden moeten expliciet worden geschreven met behulp van het
nachtervoegsel om de letterlijke waarde te parseren als eenBigInteger.
Letterlijke waarden van grote waarden parseren
Eerder werden hogere gehele getallen geparseerd als dubbel 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 achtervoegsel N gebruiken.
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
Waarden tussen [ulong]::MaxValue en [decimal]::MaxValue moeten ook worden aangeduid met behulp van het decimaalachtervoegsel D om de nauwkeurigheid te behouden. Zonder het achtervoegsel worden deze waarden geparseerd als [double] met behulp van de echte parseringsmodus.