about_Numeric_Literals
Kurze Beschreibung
In diesem Artikel werden die Syntax und Verwendung numerischer Werte in PowerShell beschrieben.
Lange Beschreibung
Es gibt zwei Arten numerischer Literale: ganze Zahl und real. Beide können Typ- und Multiplikatorsuffixe aufweisen.
Ganzzahlenliterale
Ganzzahlige Literale können in dezimaler, hexadezimaler oder binärer Schreibweise geschrieben werden.
Hexadezimalliterale werden präfixiert 0x
, und binäre Literale werden präfixiert 0b
, um sie von Dezimalzahlen zu unterscheiden.
Ganzzahlige Literale können ein Typsuffix und ein Multiplikatorsuffix aufweisen.
Suffix | Bedeutung | Hinweis |
---|---|---|
y |
signierter Byte-Datentyp | In PowerShell 6.2 hinzugefügt |
uy |
Nicht signierter Byte-Datentyp | In PowerShell 6.2 hinzugefügt |
s |
short-Datentyp | In PowerShell 6.2 hinzugefügt |
us |
unsigned short data type | In PowerShell 6.2 hinzugefügt |
l |
long data type | |
u |
unsigned int oder long data type | In PowerShell 6.2 hinzugefügt |
ul |
unsigned long data type | In PowerShell 6.2 hinzugefügt |
n |
BigInteger-Datentyp | In PowerShell 7.0 hinzugefügt |
kb |
Kibibyte (10241) Multiplizierer | |
mb |
Mebibyte (10242) Multiplizierer | |
gb |
Gigibyte (10243) Multiplizierer | |
tb |
Teribyte (10244) Multiplizierer | |
pb |
Petibyte (10245) Multiplizierer |
Der Typ eines ganzzahligen Literals wird durch seinen Wert, das Typsuffix und das numerische Multiplikatorsuffix bestimmt.
Für ein ganzzahliges Literal ohne Typsuffix:
- Wenn der Wert durch typ
[int]
dargestellt werden kann, ist dies der Typ. - Andernfalls kann der Wert durch typ
[long]
dargestellt werden, d. h. dessen Typ. - Andernfalls kann der Wert durch typ
[decimal]
dargestellt werden, d. h. dessen Typ. - Andernfalls wird sie durch Typ
[double]
dargestellt.
Für ein ganzzahliges Literal mit einem Typsuffix:
- Wenn das Typsuffix lautet
u
und der Wert durch typ[uint]
dargestellt werden kann, lautet[uint]
der Typ . - Wenn das Typsuffix lautet
u
und der Wert durch typ[ulong]
dargestellt werden kann, lautet[ulong]
der Typ . - Wenn der Wert durch den angegebenen Typ dargestellt werden kann, ist dies der Typ.
- Andernfalls ist dieses Literal falsch formatiert.
Real-Literale
Reale Literale können nur in dezimaler Schreibweise geschrieben werden. Diese Schreibweise kann Bruchwerte nach einem Dezimalkomma und einer wissenschaftlichen Schreibweise mit exponentiellem Teil enthalten.
Der exponentielle Teil enthält ein 'e' gefolgt von einem optionalen Zeichen (+/-) und einer Zahl, die den Exponenten darstellt. Beispielsweise entspricht der Literalwert dem numerischen Wert 1e2
100.
Echte Literale können ein Typsuffix und ein Multiplikatorsuffix aufweisen.
Suffix | Bedeutung |
---|---|
d |
decimal-Datentyp |
kb |
Kibibyte (10241) Multiplizierer |
mb |
Mebibyte (10242) Multiplizierer |
gb |
Gigibyte (10243) Multiplizierer |
tb |
Teribyte (10244) Multiplizierer |
pb |
Petibyte (10245) Multiplizierer |
Es gibt zwei Arten von Real-Literalen: Double und Dezimal. Diese werden durch das Fehlen bzw. Vorhandensein von Dezimaltypsuffix angegeben. PowerShell unterstützt keine Literaldarstellung eines [float]
Werts. Ein doppeltes reales Literal hat Typ [double]
. Ein dezimales reales Literal hat Typ [decimal]
.
Nachstellende Nullen im Bruchteil eines Dezimal-Real-Literals sind von Bedeutung.
Wenn der Wert der Ziffern des Exponenten-Webparts in einem [double]
realen Literal kleiner als das unterstützte Minimum ist, beträgt der Wert dieses [double]
realen Literals 0. Wenn der Wert der Ziffern eines Exponententeils in einem [decimal]
echten Literal kleiner als das unterstützte Minimum ist, wird dieses Literal falsch formatiert. Wenn der Wert der Ziffern eines Exponententeils in einem [double]
oder [decimal]
echten Literal größer als der maximal unterstützte Wert ist, wird dieses Literal falsch formatiert.
Hinweis
Die Syntax ermöglicht ein doppeltes reales Literal, um ein long-type-Suffix zu haben.
PowerShell behandelt diesen Fall als ganzzahliges Literal, dessen Wert durch Typ [long]
dargestellt wird. Dieses Feature wurde aus Gründen der Abwärtskompatibilität mit früheren Versionen von PowerShell beibehalten. Programmierern wird jedoch davon abgeraten, ganzzahlige Literale dieser Form zu verwenden, da sie den tatsächlichen Wert des Literals leicht verdecken können. Hat z. B. 1.2L
den Wert 1, 1.2345e1L
hat den Wert 12 und 1.2345e-5L
den Wert 0, von denen keine sofort offensichtlich ist.
Numerische Multiplikatoren
Aus Gründen der Einfachheit können ganzzahlige und reale Literale einen numerischen Multiplikator enthalten, der einen satz häufig verwendeter Potenzen von 2 angibt. Der numerische Multiplikator kann in einer beliebigen Kombination aus Groß- oder Kleinbuchstaben geschrieben werden.
Die Multiplikatorsuffixe können in Kombination mit beliebigen Typsuffixen verwendet werden, müssen aber nach dem Typsuffix vorhanden sein. Beispielsweise ist das Literal 100gbL
falsch formatiert, aber das Literal 100Lgb
ist gültig.
Wenn ein Multiplikator einen Wert erstellt, der die möglichen Werte für den numerischen Typ überschreitet, den das Suffix angibt, ist das Literal falsch formatiert. Beispielsweise ist das Literal 1usgb
falsch formatiert, da der Wert 1gb
größer ist als das, was für den [ushort]
durch das us
Suffix angegebenen Typ zulässig ist.
Beispiele für Multiplikatoren
PS> 1kb
1024
PS> 1.30Dmb
1363148.80
PS> 0x10Gb
17179869184
PS> 1.4e23tb
1.5393162788864E+35
PS> 0x12Lpb
20266198323167232
Numerische Zugriffstasten
PowerShell unterstützt die folgenden Zugriffstasten:
Accelerator | Hinweis | Beschreibung |
---|---|---|
[byte] |
Byte (nicht signiert) | |
[sbyte] |
Byte (signiert) | |
[Int16] |
16-Bit-Ganzzahl | |
[short] |
Alias für [int16] |
16-Bit-Ganzzahl |
[UInt16] |
16-Bit-Ganzzahl (nicht signiert) | |
[ushort] |
Alias für [uint16] |
16-Bit-Ganzzahl (nicht signiert) |
[Int32] |
32-bit integer | |
[int] |
Alias für [int32] |
32-bit integer |
[UInt32] |
32-Bit-Ganzzahl (nicht signiert) | |
[uint] |
Alias für [uint32] |
32-Bit-Ganzzahl (nicht signiert) |
[Int64] |
64-Bit-Ganzzahl | |
[long] |
Alias für [int64] |
64-Bit-Ganzzahl |
[UInt64] |
64-Bit-Ganzzahl (nicht signiert) | |
[ulong] |
Alias für [uint64] |
64-Bit-Ganzzahl (nicht signiert) |
[bigint] |
Siehe BigInteger Struct | |
[single] |
Gleitkomma mit einfacher Genauigkeit | |
[float] |
Alias für [single] |
Gleitkomma mit einfacher Genauigkeit |
[double] |
Gleitkomma mit doppelter Genauigkeit | |
[decimal] |
128-Bit-Gleitkomma |
Hinweis
Die folgenden Typbeschleuniger wurden in PowerShell 6.2 hinzugefügt: [short]
, , [ushort]
, [uint]
. [ulong]
Beispiele
Die folgende Tabelle enthält mehrere Beispiele für numerische Literale und listet deren Typ und Wert auf:
Anzahl | Typ | Wert |
---|---|---|
100 | Int32 | 100 |
100u | UInt32 | 100 |
100D | Decimal | 100 |
100l | Int64 | 100 |
100uL | UInt64 | 100 |
100us | UInt16 | 100 |
100uy | Byte | 100 |
100y | SByte | 100 |
1e2 | Double | 100 |
1.e2 | Double | 100 |
0x1e2 | Int32 | 482 |
0x1e2L | Int64 | 482 |
0x1e2D | Int32 | 7725 |
482D | Decimal | 482 |
482gb | Int64 | 517543559168 |
482ngb | BigInteger | 517543559168 |
0x1e2lgb | Int64 | 517543559168 |
0b10110111 | Int32 | 91 |
0xFFFFs | Int16 | -1 |
0xFFFFFFFF | Int32 | -1 |
-0xFFFFFFFF | Int32 | 1 |
0xFFFFFFFFu | UInt32 | 4294967295 |
Arbeiten mit binären oder hexadezimalen Zahlen
Übermäßig große binäre oder hexadezimale Literale können nicht als Fehlschlagen der Analyse zurückgegeben [bigint]
werden, wenn und nur, wenn das n
Suffix angegeben ist. Zeichenbits werden jedoch weiterhin oberhalb von Bereichen [decimal]
beachtet:
- Wenn eine binäre Zeichenfolge ein Vielfaches von 8 Bits ist, wird das höchste Bit als Zeichenbit behandelt.
- Wenn eine Hexadenzzeichenfolge, die eine Länge von 8 hat, die erste Ziffer mit 8 oder höher hat, wird die Zahl als negativ behandelt.
Wenn Sie ein nicht signiertes Suffix für binäre Und hexadente Literale angeben, werden Signierbits ignoriert. Gibt z. B. 0xFFFFFFFF
-1
den 0xFFFFFFFFu
[uint]::MaxValue
Wert 4294967295 zurück.
In PowerShell 7.1 gibt die Verwendung eines Typsuffix für ein Hexadral jetzt einen signierten Wert dieses Typs zurück. In PowerShell 7.0 gibt der Ausdruck 0xFFFFs
beispielsweise einen Fehler zurück, da der positive Wert für einen [int16]
Typ zu groß ist.
PowerShell 7.1 interpretiert dies als -1
typ [int16]
.
Durch das Präfix des Literals wird 0
dies umgangen und als nicht signiert behandelt.
Beispiel: 0b011111111
Dies kann beim Arbeiten mit Literalen im [bigint]
Bereich erforderlich sein, da die u
Und n
Suffixe nicht kombiniert werden können.
Sie können binäre und hexadäre Literale auch mithilfe des -
Präfixes negieren. Dies kann zu einer positiven Zahl führen, da Zeichenbits zulässig sind.
Sign-Bits werden für BigInteger-suffixed numerals akzeptiert:
- BigInteger-suffixed hex behandelt das hohe Bit eines beliebigen Literals mit einer Länge von mehreren von 8 Zeichen als Zeichenbit. Die Länge enthält nicht das
0x
Präfix oder Suffixe. - BigInteger-suffixed binary akzeptiert Sign-Bits bei 96 und 128 Zeichen, und alle 8 Zeichen danach.
Konvertierung des numerischen Typs
Wenn Zeichenfolgen in Zahlen konvertiert werden, werden zusätzliche Hexadezimalformatindikatoren unterstützt. Diese zusätzlichen Formate werden nicht als Literale erkannt.
[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF
[int] '0b1111' -eq 0b1111
[int] '0b1111' -eq 15
Befehle, die wie numerische Literale aussehen
Jeder Befehl, der wie ein gültiges numerisches Literal aussieht, muss mit dem Aufrufoperator () ausgeführt werden,&
andernfalls wird er als Zahl interpretiert. Falsch formatierte Literale mit gültiger Syntax führen zu 1usgb
folgendem Fehler:
PS> 1usgb
At line:1 char:6
+ 1usgb
+ ~
The numeric constant 1usgb is not valid.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant
Falsch formatierte Literale mit ungültiger Syntax 1gbus
werden jedoch als standardmäßige Bare-Zeichenfolge interpretiert und können als gültiger Befehlsname in Kontexten interpretiert werden, in denen Befehle aufgerufen werden können.
Zugreifen auf Eigenschaften und Methoden numerischer Objekte
Für den Zugriff auf ein Element eines numerischen Literals gibt es Fälle, in denen Sie das Literal in Klammern einschließen müssen.
- Das Literal weist keinen Dezimalkomma auf.
- Das Literal weist keine Ziffern nach dem Dezimalkomma auf.
- Das Literal hat kein Suffix.
Das folgende Beispiel schlägt z. B. fehl:
PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+ ~
An expression was expected after '('.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression
Die folgenden Beispiele funktionieren:
PS> 2uL.GetType().Name
UInt64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32
Die ersten beiden Beispiele funktionieren, ohne den Literalwert in Klammern einzuschließen, da der PowerShell-Parser bestimmen kann, wo das numerische Literal endet und die GetType-Methode beginnt.
So analysiert PowerShell numerische Literale
PowerShell v7.0 hat die Art und Weise geändert, wie numerische Literale analysiert werden, um die neuen Features zu aktivieren.
Analysieren realer numerischer Literale
Wenn das Literal einen Dezimalpunkt oder die E-Notation enthält, wird die Literalzeichenfolge als reelle Zahl analysiert.
- Wenn das Dezimalsuffix vorhanden ist, dann direkt in
[decimal]
. - Else, parse as
[Double]
and apply multiplier to the value. Überprüfen Sie dann die Typsuffixe, und versuchen Sie, in den entsprechenden Typ zu umwandeln. - Wenn die Zeichenfolge kein Typsuffix aufweist, analysieren Sie sie als
[Double]
.
Analysieren ganzzahliger numerischer Literale
Ganzzahlige Literale werden mithilfe der folgenden Schritte analysiert:
- Bestimmen des Radix-Formats
- Analysieren Sie bei Binärformaten in
[BigInteger]
. - Analysieren Sie bei Hexadezimalformaten spezielle Fälle, um ursprüngliche Verhaltensweisen beizubehalten,
[BigInteger]
wenn sich der Wert im[int]
Oder[long]
Bereich befindet. - Wenn weder binär noch hex, parse normal als ein
[BigInteger]
.
- Analysieren Sie bei Binärformaten in
- Wenden Sie den Multiplikatorwert an, bevor Sie versuchen, umwandlungen zu versuchen, um sicherzustellen, dass Die Typgrenzen ohne Überlauf ordnungsgemäß überprüft werden können.
- Überprüfen Sie Typsuffixe.
- Überprüfen Sie die Grenzen des Typs, und versuchen Sie, diesen Typ zu analysieren.
- Wenn kein Suffix verwendet wird, wird der Wert in der folgenden Reihenfolge eingecheckt, sodass der erste erfolgreiche Test den Typ der Zahl bestimmt.
[int]
[long]
[decimal]
(nur Base-10-Literale)[double]
(nur Base-10-Literale)
- Wenn sich der Wert außerhalb des
[long]
Bereichs für Hexadär- und Binärzahlen befindet, schlägt die Analyse fehl. - Wenn sich der Wert außerhalb des Bereichs für die
[double]
Basis 10-Zahl befindet, schlägt die Analyse fehl. - Höhere Werte müssen explizit mit dem
n
Suffix geschrieben werden, um das Literal als einBigInteger
.
Analysieren großer Wertliterale
Zuvor wurden höhere ganzzahlige Werte als doppelt analysiert, bevor sie in einen anderen Typ umgewandelt werden. Dies führt zu einem Genauigkeitsverlust in den höheren Bereichen. Zum Beispiel:
PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904
Um dieses Problem zu vermeiden, mussten Sie Werte als Zeichenfolgen schreiben und dann konvertieren:
PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111
In PowerShell 7.0 müssen Sie das N
Suffix verwenden.
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
Außerdem sollten Werte zwischen [ulong]::MaxValue
und [decimal]::MaxValue
mit dem Dezimalsuffix D
angegeben werden, um die Genauigkeit aufrechtzuerhalten. Ohne das Suffix werden diese Werte so analysiert, dass [Double]
der reale Analysemodus verwendet wird.