about_Numeric_Literals
Krátký popis
Tento článek popisuje syntaxi a použití číselných hodnot v PowerShellu.
Dlouhý popis
Existují dva druhy číselných literálů: celé číslo a reálné. Oba můžou mít přípony typu a násobitele.
Celočíselné literály
Celočíselné literály lze zapsat v desítkovém, šestnáctkovém nebo binárním zápisu.
Šestnáctkové literály mají předponu a binární literály mají předponu 0x
0b
, aby se odlišily od desetinných čísel.
Celočíselné literály můžou mít příponu typu a příponu násobitele.
Přípona | Význam | Poznámka: |
---|---|---|
y |
Podepsaný datový typ bajtů | Přidáno v PowerShellu 6.2 |
uy |
Datový typ bez znaménka | Přidáno v PowerShellu 6.2 |
s |
krátký datový typ | Přidáno v PowerShellu 6.2 |
us |
Krátký datový typ bez znaménka | Přidáno v PowerShellu 6.2 |
l |
dlouhý datový typ | |
u |
nepodepsaný int nebo dlouhý datový typ | Přidáno v PowerShellu 6.2 |
ul |
nepodepsaný dlouhý datový typ | Přidáno v PowerShellu 6.2 |
n |
Datový typ BigInteger | Přidáno v PowerShellu 7.0 |
kb |
násobitel kibibajtů (10241) | |
mb |
mebibajtů (10242) násobitel | |
gb |
násobitel gigibajtů (10243) | |
tb |
násobitel teribajtů (10244) | |
pb |
násobitel petibajtů (10245) |
Typ celočíselného literálu je určen jeho hodnotou, příponou typu a číselnou příponou násobitele.
Pro celočíselnou literál bez přípony typu:
- Pokud může být hodnota reprezentována typem
[int]
, to je jeho typ. - V opačném případě, pokud lze hodnotu reprezentovat podle typu
[long]
, to je jeho typ. - V opačném případě, pokud lze hodnotu reprezentovat podle typu
[decimal]
, to je jeho typ. - V opačném případě je reprezentován typem
[double]
.
Pro celočíselnou literál s příponou typu:
- Pokud je
u
přípona typu a hodnota může být reprezentována typem[uint]
, je[uint]
jeho typ . - Pokud je
u
přípona typu a hodnota může být reprezentována typem[ulong]
, je[ulong]
jeho typ . - Pokud je její hodnota reprezentována typem zadaným, pak je to jeho typ.
- Jinak je tento literál poškozený.
Skutečné literály
Skutečné literály lze zapsat pouze v desítkovém zápisu. Tento zápis může obsahovat desetinné hodnoty za desetinnou čárkou a vědecký zápis pomocí exponenciální části.
Exponenciální část obsahuje znak e následovaný volitelným symbolem (+/-) a číslem představujícím exponent. Například hodnota 1e2
literálu se rovná číselné hodnotě 100.
Skutečné literály můžou mít příponu typu a příponu násobitele.
Přípona | Význam |
---|---|
d |
desetinný datový typ |
kb |
násobitel kibibajtů (10241) |
mb |
mebibajtů (10242) násobitel |
gb |
násobitel gigibajtů (10243) |
tb |
násobitel teribajtů (10244) |
pb |
násobitel petibajtů (10245) |
Existují dva druhy reálného literálu: double a decimal. Ty jsou označeny absencí nebo přítomností přípony typu desetinné čárky. PowerShell nepodporuje literální reprezentaci [float]
hodnoty. Dvojitý skutečný literál má typ [double]
. Desetinný skutečný literál má typ [decimal]
.
Koncové nuly v části zlomku desetinného reálného literálu jsou významné.
Pokud je hodnota číslic exponent-part v reálném literálu [double]
menší než minimální podporovaná hodnota, hodnota tohoto [double]
reálného literálu je 0. Pokud je hodnota číslic exponent-part v reálném literálu [decimal]
menší než minimální podporovaná hodnota, je tento literál poškozený. Pokud je hodnota číslic exponent-part v reálném [double]
literálu [decimal]
větší než maximální podporovaná hodnota, je tento literál poškozený.
Poznámka:
Syntaxe umožňuje dvojitý skutečný literál mít příponu dlouhého typu.
PowerShell považuje tento případ za celočíselnou literál, jehož hodnota je reprezentována typem [long]
. Tato funkce byla zachována kvůli zpětné kompatibilitě se staršími verzemi PowerShellu. Programátoři ale nedoporučuje používat celočíselné literály tohoto formuláře, protože mohou snadno zakrýt skutečnou hodnotu literálu. Má například 1.2L
hodnotu 1, 1.2345e1L
má hodnotu 12 a 1.2345e-5L
má hodnotu 0, z níž není okamžitě zřejmé.
Číselné násobitele
Pro usnadnění může celé číslo a reálné literály obsahovat číselný násobitel, který označuje jednu ze sady běžně používaných mocnin 2. Číselný násobitel lze zapsat v libovolné kombinaci velkých nebo malých písmen.
Přípony násobitele lze použít v kombinaci s libovolnou příponou typu, ale musí být přítomny za příponou typu. Literál 100gbL
je například poškozený, ale literál 100Lgb
je platný.
Pokud násobitel vytvoří hodnotu, která překračuje možné hodnoty číselného typu, který určuje přípona, literál je poškozený. Literál 1usgb
je například poškozený, protože hodnota 1gb
je větší, než je povoleno pro [ushort]
typ určený příponou us
.
Příklady násobitele
PS> 1kb
1024
PS> 1.30Dmb
1363148.80
PS> 0x10Gb
17179869184
PS> 1.4e23tb
1.5393162788864E+35
PS> 0x12Lpb
20266198323167232
Akcelerátory číselného typu
PowerShell podporuje následující akcelerátory typů:
Akcelerátor | Poznámka: | Popis |
---|---|---|
[byte] |
Bajt (bez znaménka) | |
[sbyte] |
Bajt (podepsaný) | |
[Int16] |
16bitové celé číslo | |
[short] |
alias pro [int16] |
16bitové celé číslo |
[UInt16] |
16bitové celé číslo (bez znaménka) | |
[ushort] |
alias pro [uint16] |
16bitové celé číslo (bez znaménka) |
[Int32] |
32bitové celé číslo | |
[int] |
alias pro [int32] |
32bitové celé číslo |
[UInt32] |
32bitové celé číslo (bez znaménka) | |
[uint] |
alias pro [uint32] |
32bitové celé číslo (bez znaménka) |
[Int64] |
64bitové celé číslo | |
[long] |
alias pro [int64] |
64bitové celé číslo |
[UInt64] |
64bitové celé číslo (bez znaménka) | |
[ulong] |
alias pro [uint64] |
64bitové celé číslo (bez znaménka) |
[bigint] |
Viz BigInteger – struktura | |
[single] |
Jednoduchá přesnost s plovoucí desetinnou čárkou | |
[float] |
alias pro [single] |
Jednoduchá přesnost s plovoucí desetinnou čárkou |
[double] |
Dvojitá přesnost s plovoucí desetinnou čárkou | |
[decimal] |
128bitová plovoucí čárka |
Poznámka:
V PowerShellu 6.2 byly přidány následující akcelerátory typů: [short]
, [ushort]
, [uint]
. [ulong]
Příklady
Následující tabulka obsahuje několik příkladů číselných literálů a uvádí jejich typ a hodnotu:
Počet | Typ | Hodnota |
---|---|---|
100 | Int32 | 100 |
100u | UInt32 | 100 |
100D | Desetinné číslo | 100 |
100l | Int64 | 100 |
100uL | UInt64 | 100 |
100us | UInt16 | 100 |
100uy | Byte | 100 |
100y | SByte | 100 |
1e2 | Hodnota s dvojitou přesností | 100 |
1.e2 | Hodnota s dvojitou přesností | 100 |
0x1e2 | Int32 | 482 |
0x1e2L | Int64 | 482 |
0x1e2D | Int32 | 7725 |
482D | Desetinné číslo | 482 |
482gb | Int64 | 517543559168 |
482ngb | BigInteger | 517543559168 |
0x1e2lgb | Int64 | 517543559168 |
0b1011011 | Int32 | 91 |
0xFFFFs | Int16 | -1 |
0xFFFFFFFF | Int32 | -1 |
-0xFFFFFFFF | Int32 | 0 |
0xFFFFFFFFu | UInt32 | 4294967295 |
Práce s binárními nebo šestnáctkovými čísly
Příliš velké binární nebo šestnáctkové literály se můžou vrátit jako [bigint]
spíše než selhávající analýza, pokud je zadaná přípona a pouze v případě n
, že je zadaná přípona. Bity znaménka jsou stále respektovány nad sudými [decimal]
rozsahy, ale:
- Pokud je binární řetězec nějaký násobek 8 bitů dlouhý, považuje se nejvyšší bit za znaménko.
- Pokud šestnáctkový řetězec, který má délku, která je násobkem 8, má první číslici s číslem 8 nebo vyšší, bude číslice považována za zápornou.
Zadání přípony bez znaménka v binární soustavě a šestnáctkové literály ignoruje bity znaménka. Například 0xFFFFFFFF
vrátí -1
hodnotu , ale 0xFFFFFFFFu
vrátí [uint]::MaxValue
4294967295.
V PowerShellu 7.1 teď použití přípony typu v šestnáctkovém literálu vrátí podepsanou hodnotu tohoto typu. Například v PowerShellu 7.0 výraz 0xFFFFs
vrátí chybu, protože kladná hodnota je pro [int16]
typ příliš velká.
PowerShell 7.1 to interpretuje jako -1
typ [int16]
.
Předpona literálu s 0
znaky bude vynechána a bude považována za nepodepsanou.
Například: 0b011111111
. To může být nutné při práci s literály v [bigint]
oblasti, protože u
přípony a n
přípony nelze kombinovat.
Můžete také negovat binární a šestnáctkové literály pomocí předpony -
. Výsledkem může být kladné číslo, protože jsou povoleny znaménka.
Pro číslice s příponou BigInteger se přijímají znaménka:
- Hex s příponou BigInteger zachází s vysokým bitem jakéhokoli literálu s délkou násobku 8 znaků jako bit znaménka. Délka neobsahuje předponu
0x
ani žádné přípony. - Binární soubor s příponou BigInteger přijímá bity znaménka na 96 a 128 znaků a každých 8 znaků za.
Převod číselného typu
Při převodu řetězců na čísla se podporují další šestnáctkové indikátory formátu. Tyto další formáty se nerozpoznají jako literály.
[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF
[int] '0b1111' -eq 0b1111
[int] '0b1111' -eq 15
Příkazy, které vypadají jako číselné literály
Každý příkaz, který vypadá jako platný číselný literál, musí být proveden pomocí operátoru volání (&
), jinak se interpretuje jako číslo. Chybné literály s platnou syntaxí, jako 1usgb
je například, způsobí následující chybu:
PS> 1usgb
At line:1 char:6
+ 1usgb
+ ~
The numeric constant 1usgb is not valid.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant
Chybné literály s neplatnou syntaxí, jako 1gbus
je například, se interpretují jako standardní holý řetězec a lze je interpretovat jako platný název příkazu v kontextech, kde se můžou volat příkazy.
Přístup k vlastnostem a metodám číselných objektů
Pokud chcete získat přístup k členu číselného literálu, existují případy, kdy potřebujete literál uzavřít do závorek.
- Literál nemá desetinnou čárku.
- Literál neobsahuje žádné číslice za desetinnou čárkou.
- Literál nemá příponu.
Například následující příklad selže:
PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+ ~
An expression was expected after '('.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression
Následující příklady fungují:
PS> 2uL.GetType().Name
UInt64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32
První dva příklady fungují bez uzavření hodnoty literálu do závorek, protože analyzátor PowerShellu může určit, kde číselný literál končí a metoda GetType začíná.
Jak PowerShell analyzuje číselné literály
PowerShell v7.0 změnil způsob analýzy číselných literálů, aby bylo možné nové funkce povolit.
Analýza skutečných číselných literálů
Pokud literál obsahuje desetinnou čárku nebo e-notaci, literálový řetězec se analyzuje jako reálné číslo.
- Pokud je přípona desetinné čárky přítomna, pak přímo do
[decimal]
. - Jinak, parsujte jako
[Double]
a použijte násobitel na hodnotu. Potom zkontrolujte přípony typů a pokuste se přetypovat na příslušný typ. - Pokud řetězec nemá příponu typu, parsujte ji jako
[Double]
.
Analýza celočíselných číselných literálů
Literály typu Integer se analyzují pomocí následujících kroků:
- Určení formátu radix
- Pro binární formáty parsovat do
[BigInteger]
. - V případě šestnáctkových formátů parsujte do
[BigInteger]
speciálních případů původní chování, pokud je hodnota v rozsahu[int]
nebo[long]
oblasti. - Pokud binární ani šestnáctková, parsuje se normálně jako
[BigInteger]
.
- Pro binární formáty parsovat do
- Před pokusem o přetypování použijte hodnotu násobení, abyste zajistili, že je možné vhodnou kontrolu typů bez přetečení.
- Zkontrolujte přípony typu.
- Zkontrolujte hranice typů a pokuste se ho analyzovat.
- Pokud se nepoužívá žádná přípona, je hodnota v následujícím pořadí vrácena se změnami, což vede k prvnímu úspěšnému testu určujícímu typ čísla.
[int]
[long]
-
[decimal]
(pouze literály base-10) -
[double]
(pouze literály base-10)
- Pokud je hodnota mimo
[long]
rozsah šestnáctkových a binárních čísel, analýza selže. - Pokud je hodnota mimo
[double]
rozsah základního čísla 10, analýza selže. - Vyšší hodnoty musí být explicitně zapsány pomocí
n
přípony k analýze literálu jako .BigInteger
Analýza literálů velkých hodnot
Dříve byly před přetypování na jakýkoli jiný typ analyzovány vyšší celočíselné hodnoty jako dvojité. Výsledkem je ztráta přesnosti ve vyšších rozsazích. Příklad:
PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904
Abyste se tomuto problému vyhnuli, museli jste zapsat hodnoty jako řetězce a pak je převést:
PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111
V PowerShellu 7.0 musíte použít příponu N
.
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
Hodnoty mezi [ulong]::MaxValue
desetinnou příponou a [decimal]::MaxValue
měly by být označeny také pomocí přípony D
desetinné čárky, aby se zachovala přesnost. Bez přípony se tyto hodnoty analyzují jako [Double]
použití režimu reálné analýzy.