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:
- 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]
.
- W przypadku formatów binarnych przeanalizuj wartość w pliku
- Zastosuj wartość mnożnika przed podjęciem próby rzutowania, aby upewnić się, że granice typu mogą być odpowiednio sprawdzane bez przepełnienia.
- 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ł jakoBigInteger
.
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.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla