Sdílet prostřednictvím


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 0x0b , 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í -1hodnotu , 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ů:

  1. 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].
  2. 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í.
  3. 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.