about_Numeric_Literals

Krótki opis

W tym artykule opisano składnię i użycie wartości liczbowych w programie PowerShell.

Długi opis

Istnieją dwa rodzaje literałów liczbowych: liczba całkowita i rzeczywista. Oba mogą mieć sufiksy typu i mnożnika.

Literały liczb całkowitych

Literały liczb całkowitych można zapisywać w notacji dziesiętnej, szesnastkowej lub binarnej. Literały szesnastkowe są poprzedzone literałami binarnymi 0x , a literały binarne są poprzedzone prefiksem 0b , aby odróżnić je od liczb dziesiętnych.

Literały liczb całkowitych mogą mieć sufiks typu i sufiks mnożnika.

Sufiks Znaczenie Uwaga
y typ danych podpisanych bajtów Dodano w programie PowerShell 6.2
uy niepodpisany typ danych bajtów Dodano w programie PowerShell 6.2
s krótki typ danych Dodano w programie PowerShell 6.2
us niepodpisany krótki typ danych Dodano w programie PowerShell 6.2
l długi typ danych
u niepodpisany lub długi typ danych Dodano w programie PowerShell 6.2
ul niepodpisany długi typ danych Dodano w programie PowerShell 6.2
n Typ danych BigInteger Dodano w programie PowerShell 7.0
kb mnożnik kilobajtów
mb mnożnik megabajtów
gb mnożnik gigabajtów
tb mnożnik terabajtów
pb mnożnik petabajtów

Typ literału liczby całkowitej jest określany przez jego wartość, sufiks typu i sufiks mnożnika liczbowego.

Dla literału liczby całkowitej bez sufiksu typu:

  • Jeśli wartość może być reprezentowana przez typ [int], jest to jego typ.
  • W przeciwnym razie, jeśli wartość może być reprezentowana przez typ [long], jest to jego typ.
  • W przeciwnym razie, jeśli wartość może być reprezentowana przez typ [decimal], jest to jego typ.
  • W przeciwnym razie jest reprezentowany przez typ [double].

Dla literału liczby całkowitej z sufiksem typu:

  • Jeśli sufiks typu to u i wartość może być reprezentowana przez typ [uint] , jego typ to [uint].
  • Jeśli sufiks typu to u i wartość może być reprezentowana przez typ [ulong] , jego typ to [ulong].
  • Jeśli jego wartość może być reprezentowana przez określony typ, jest to jego typ.
  • W przeciwnym razie literał jest źle sformułowany.

Literały rzeczywiste

Literały rzeczywiste mogą być zapisywane tylko w notacji dziesiętnej. Ta notacja może obejmować wartości ułamkowe po punkcie dziesiętnym i notacji naukowej przy użyciu części wykładniczej.

Część wykładnicza zawiera znak "e", po którym następuje opcjonalny znak (+/-) i liczba reprezentująca wykładnik. Na przykład wartość 1e2 literału jest równa wartości liczbowej 100.

Literały rzeczywiste mogą mieć sufiks typu i sufiks mnożnika.

Sufiks Znaczenie
d Typ danych dziesiętnych
kb mnożnik kilobajtów
mb mnożnik megabajtów
gb mnożnik gigabajtów
tb mnożnik terabajtów
pb mnożnik petabajtów

Istnieją dwa rodzaje rzeczywistego literału: podwójne i dziesiętne. Są one wskazywane odpowiednio przez brak lub obecność sufiksu typu dziesiętnego. Program PowerShell nie obsługuje literału reprezentacji [float] wartości. Podwójny literał rzeczywisty ma typ [double]. Literał rzeczywisty dziesiętny ma typ [decimal]. Końcowe zera w części ułamkowej literału rzeczywistego dziesiętnego są znaczące.

Jeśli wartość cyfr części wykładniczej [double] w rzeczywistym literału jest mniejsza niż wartość minimalna obsługiwana, wartość tego [double] literału rzeczywistego wynosi 0. Jeśli wartość cyfr części wykładniczej [decimal] w rzeczywistym literału jest mniejsza niż wartość minimalna obsługiwana, literał jest źle sformułowany. Jeśli wartość cyfr części wykładniczej w literału rzeczywistego [double] lub [decimal] rzeczywistego jest większa niż wartość maksymalna obsługiwana, literał jest źle sformułowany.

Uwaga

Składnia umożliwia podwójne literałowi rzeczywistemu posiadanie sufiksu typu długiego. Program PowerShell traktuje ten przypadek jako literał liczb całkowitych, którego wartość jest reprezentowana przez typ [long]. Ta funkcja została zachowana w celu zapewnienia zgodności z poprzednimi wersjami programu PowerShell. Jednak programiści są zniechęceni do używania literałów liczb całkowitych tego formularza, ponieważ mogą łatwo zasłonić rzeczywistą wartość literału. Na przykład 1.2L ma wartość 1, 1.2345e1L ma wartość 12 i 1.2345e-5L ma wartość 0, z których żadna nie jest natychmiast oczywista.

Mnożniki liczbowe

Dla wygody literały całkowite i rzeczywiste mogą zawierać mnożnik liczbowy, który wskazuje jeden z zestaw powszechnie używanych uprawnień 2. Mnożnik liczbowy można zapisać w dowolnej kombinacji wielkich lub małych liter.

Sufiksy mnożnika mogą być używane w połączeniu z sufiksami dowolnego typu, ale muszą być obecne po sufiksie typu. Na przykład literał 100gbL jest źle sformułowany, ale literał 100Lgb jest prawidłowy.

Jeśli mnożnik tworzy wartość, która przekracza możliwe wartości dla typu liczbowego określonego przez sufiks, literał jest źle sformułowany. Na przykład literał 1usgb jest źle sformułowany, ponieważ wartość 1gb jest większa niż dozwolona dla [ushort] typu określonego us przez sufiks.

Przykłady mnożnika

PS> 1kb
1024

PS> 1.30Dmb
1363148.80

PS> 0x10Gb
17179869184

PS> 1.4e23tb
1.5393162788864E+35

PS> 0x12Lpb
20266198323167232

Akceleratory typów liczbowych

Program PowerShell obsługuje następujące akceleratory typów:

Akcelerator Uwaga opis
[byte] Bajt (bez znaku)
[sbyte] Bajt (podpisany)
[Int16] 16-bitowa liczba całkowita
[short] alias dla [int16] 16-bitowa liczba całkowita
[UInt16] 16-bitowa liczba całkowita (bez znaku)
[ushort] alias dla [uint16] 16-bitowa liczba całkowita (bez znaku)
[Int32] 32-bitowa liczba całkowita
[int] alias dla [int32] 32-bitowa liczba całkowita
[UInt32] 32-bitowa liczba całkowita (bez znaku)
[uint] alias dla [uint32] 32-bitowa liczba całkowita (bez znaku)
[Int64] 64-bitowe liczby całkowite
[long] alias dla [int64] 64-bitowe liczby całkowite
[UInt64] 64-bitowa liczba całkowita (bez znaku)
[ulong] alias dla [uint64] 64-bitowa liczba całkowita (bez znaku)
[bigint] Zobacz BigInteger, struktura
[single] Pojedyncza precyzja zmiennoprzecinkowa
[float] alias dla [single] Pojedyncza precyzja zmiennoprzecinkowa
[double] Zmiennoprzecinkowa podwójna precyzja
[decimal] 128-bitowy zmiennoprzecinkowa

Uwaga

W programie PowerShell 6.2 dodano następujące akceleratory typów: [short], [ushort], [uint], [ulong].

Przykłady

Poniższa tabela zawiera kilka przykładów literałów liczbowych i wyświetla ich typ i wartość:

Liczba Type Wartość
100 Int32 100
100u UInt32 100
100D Dziesiętne 100
100l Int64 100
100uL UInt64 100
100us UInt16 100
100uy Byte 100
100y SByte 100
1e2 Liczba rzeczywista 100
1.e2 Liczba rzeczywista 100
0x1e2 Int32 482
0x1e2L Int64 482
0x1e2D Int32 7725
482D Dziesiętne 482
482gb Int64 517543559168
482ngb BigInteger 517543559168
0x1e2lgb Int64 517543559168
0b1011011 Int32 91
0xFFFFs Int16 -1
0xFFFFFFFF Int32 -1
-0xFFFFFFFF Int32 1
0xFFFFFFfFu UInt32 4294967295

Praca z liczbami binarnymi lub szesnastkowymi

Nadmiernie duże literały binarne lub szesnastkowe mogą zwracać [bigint] wartość zamiast niepowodzenia analizy, jeśli i tylko wtedy, gdy n określono sufiks. Bity znaku są nadal przestrzegane powyżej nawet [decimal] zakresów, jednak:

  • Jeśli ciąg binarny ma długość kilku 8 bitów, najwyższy bit jest traktowany jako bit znaku.
  • Jeśli ciąg szesnastkowy, który ma długość wielokrotności 8, ma pierwszą cyfrę z wartością 8 lub większą, cyfra jest traktowana jako ujemna.

Określanie niepodpisanego sufiksu w literałach binarnych i szesnastkowym ignoruje bity znaku. Na przykład 0xFFFFFFFF zwraca wartość -1, ale 0xFFFFFFFFu zwraca [uint]::MaxValue wartość 4294967295.

W programie PowerShell 7.1 przy użyciu sufiksu typu literału szesnastkowego zwraca teraz podpisaną wartość tego typu. Na przykład w programie PowerShell 7.0 wyrażenie 0xFFFFs zwraca błąd, ponieważ wartość dodatnia jest zbyt duża dla [int16] typu. Program PowerShell 7.1 interpretuje to jako -1[int16] typ.

Prefiksowanie literału z elementem 0 spowoduje obejście tego i będzie traktowane jako niepodpisane. Na przykład: 0b011111111. Może to być konieczne podczas pracy z literałami w [bigint] zakresie, ponieważ u nie można połączyć sufiksów i n .

Można również negować literały binarne i szesnastkowe przy użyciu prefiksu - . Może to spowodować liczbę dodatnią, ponieważ bity znaku są dozwolone.

Bity znaku są akceptowane dla liczb z sufiksem BigInteger:

  • Sufiks biginteger-sufiks szesnastkowy traktuje duży bit dowolnego literału o długości wielokrotności 8 znaków jako bit znaku. Długość nie zawiera prefiksu 0x ani żadnych sufiksów.
  • BigInteger-sufiks binarny akceptuje bity znaku na 96 i 128 znaków, a co 8 znaków po.

Konwersja typu liczbowego

Gdy ciągi są konwertowane na liczby, obsługiwane są dodatkowe wskaźniki formatu szesnastkowego. Te dodatkowe formaty nie są rozpoznawane jako literały.

[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF
[int] '0b1111' -eq 0b1111
[int] '0b1111' -eq 15

Polecenia, które wyglądają jak literały liczbowe

Każde polecenie, które wygląda jak prawidłowy literał liczbowy, musi zostać wykonane przy użyciu operatora wywołania (&), w przeciwnym razie jest interpretowane jako liczba. Źle sformułowane literały z prawidłową składnią, takie jak 1usgb , spowoduje następujący błąd:

PS> 1usgb
At line:1 char:6
+ 1usgb
+      ~
The numeric constant 1usgb is not valid.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant

Jednak źle sformułowane literały z nieprawidłową składnią, takie jak 1gbus , będą interpretowane jako standardowy ciąg nagie i mogą być interpretowane jako prawidłowa nazwa polecenia w kontekstach, w których mogą być wywoływane polecenia.

Uzyskiwanie dostępu do właściwości i metod obiektów liczbowych

Aby uzyskać dostęp do elementu członkowskiego literału liczbowego, istnieją przypadki, w których należy ująć literał w nawiasy.

  • Literał nie ma punktu dziesiętnego
  • Literał nie ma żadnych cyfr po przecinku dziesiętnego
  • Literał nie ma sufiksu

Na przykład następujący przykład kończy się niepowodzeniem:

PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+           ~
An expression was expected after '('.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression

Działają następujące przykłady:

PS> 2uL.GetType().Name
UInt64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32

Pierwsze dwa przykłady działają bez ujęć wartości literału w nawiasy, ponieważ analizator programu PowerShell może określić, gdzie kończy się literał liczbowy, a metoda GetType rozpoczyna się.

Jak program PowerShell analizuje literały liczbowe

Program PowerShell w wersji 7.0 zmienił sposób analizowania literałów liczbowych w celu włączenia nowych funkcji.

Analizowanie rzeczywistych literałów liczbowych

Jeśli literał zawiera punkt dziesiętny lub notację elektroniczną, ciąg literału jest analizowany jako liczba rzeczywista.

  • Jeśli sufiks dziesiętny znajduje się bezpośrednio w pliku [decimal].
  • W przeciwnym razie przeanalizuj jako [Double] mnożnik i zastosuj mnożnik do wartości. Następnie sprawdź sufiksy typów i spróbuj rzutować do odpowiedniego typu.
  • Jeśli ciąg nie ma sufiksu typu, przeanalizuj jako [Double].

Analizowanie literałów liczbowych liczb całkowitych

Literały typu liczba całkowita są analizowane, wykonując następujące kroki:

  1. Określanie formatu promienia
    • W przypadku formatów binarnych przeanalizuj wartość w pliku [BigInteger].
    • W przypadku formatów szesnastkowe przeanalizuj [BigInteger] metodę przy użyciu specjalnych casies, aby zachować oryginalne zachowania, gdy wartość znajduje się w [int] zakresie lub [long] .
    • Jeśli ani binarne, ani szesnastkowe, przeanalizuj normalnie jako [BigInteger].
  2. Zastosuj wartość mnożnika przed podjęciem próby rzutowania, aby upewnić się, że granice typu mogą być odpowiednio sprawdzane bez przepełnienia.
  3. Sprawdź sufiksy typu.
    • Sprawdź ograniczenia typu i spróbuj przeanalizować ten typ.
    • Jeśli nie jest używany sufiks, wartość jest zaewidencjonowana w następującej kolejności, co powoduje pierwszy udany test określający typ liczby.
      • [int]
      • [long]
      • [decimal] (tylko literały base-10)
      • [double] (tylko literały base-10)
    • Jeśli wartość znajduje się poza zakresem [long] liczby szesnastkowej i binarnej, analizowanie kończy się niepowodzeniem.
    • Jeśli wartość znajduje się poza zakresem [double] podstawowej liczby 10, analizowanie kończy się niepowodzeniem.
    • Wyższe wartości muszą być jawnie zapisane przy użyciu sufiksu n , aby przeanalizować literał jako BigInteger.

Analizowanie literałów dużych wartości

Wcześniej wyższe wartości całkowite były analizowane jako podwójne przed rzutowaniem do dowolnego innego typu. Powoduje to utratę dokładności w wyższych zakresach. Na przykład:

PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904

Aby uniknąć tego problemu, musisz zapisać wartości jako ciągi, a następnie przekonwertować je:

PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111

W programie PowerShell 7.0 należy użyć sufiksu N .

PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111

Wartości między wartościami [ulong]::MaxValue i [decimal]::MaxValue powinny być oznaczane przy użyciu sufiksu D dziesiętnego w celu zachowania dokładności. Bez sufiksu te wartości są analizowane jako [Double] przy użyciu trybu analizy rzeczywistej.