Share via


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 Kilobyte multiplizierer
mb Megabyte multiplizierer
gb Gigabyte-Multiplikator
tb Terabyte multiplizierer
pb Petabyte-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 Kilobyte multiplizierer
mb Megabyte multiplizierer
gb Gigabyte-Multiplikator
tb Terabyte multiplizierer
pb Petabyte-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-1den 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:

  1. Bestimmen des Radix-Formats
    • Analysieren Sie bei Binärformaten in [BigInteger].
    • Analysieren Sie bei Hexadezimalformaten die Verwendung spezieller Groß-/Kleinschreibungen, [BigInteger] um ursprüngliche Verhaltensweisen beizubehalten, wenn sich der Wert im [int] Bereich befindet [long] .
    • Wenn weder binär noch hex, parse normal als ein [BigInteger].
  2. Wenden Sie den Multiplikatorwert an, bevor Sie versuchen, umwandlungen zu versuchen, um sicherzustellen, dass Die Typgrenzen ohne Überlauf ordnungsgemäß überprüft werden können.
  3. Ü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 ein BigInteger.

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

Werte zwischen [ulong]::MaxValue und [decimal]::MaxValue sollten auch mithilfe des Dezimalsuffixs D angegeben werden, um die Genauigkeit zu Standard. Ohne das Suffix werden diese Werte so analysiert, dass [Double] der reale Analysemodus verwendet wird.