Megosztás a következőn keresztül:


about_Numeric_Literals

Rövid leírás

Ez a cikk a PowerShell numerikus értékeinek szintaxisát és használatát ismerteti.

Hosszú leírás

Kétféle numerikus literál létezik: egész szám és valós. Mindkettő típus- és szorzó-utótagokkal rendelkezhet.

Egész számkonstansok

Az egész szám literálok decimális, hexadecimális vagy bináris jelölésben írhatók. A hexadecimális literálok előtaggal 0x és bináris literálokkal vannak előtagolva 0b , így megkülönböztethetők a tizedes törtektől.

Az egész számkonstansok típus-utótagokkal és szorzó utótagokkal is rendelkezhetnek.

Toldalék Értelmezés Feljegyzés
y aláírt bájt adattípus Hozzáadva a PowerShell 6.2-ben
uy aláíratlan bájt adattípus Hozzáadva a PowerShell 6.2-ben
s rövid adattípus Hozzáadva a PowerShell 6.2-ben
us aláíratlan rövid adattípus Hozzáadva a PowerShell 6.2-ben
l hosszú adattípus
u aláíratlan int vagy long adattípus Hozzáadva a PowerShell 6.2-ben
ul aláíratlan hosszú adattípus Hozzáadva a PowerShell 6.2-ben
n BigInteger adattípus Hozzáadva a PowerShell 7.0-hoz
kb kibibyte (10241) szorzó
mb mebibyte (10242) szorzó
gb gigibyte (10243) szorzó
tb teribyte (10244) szorzó
pb petibyte (10245) szorzó

Az egész számkonstans típusát az értéke, a típus utótagja és a numerikus szorzó utótagja határozza meg.

Típus utótag nélküli egész számkonstans esetén:

  • Ha az érték típus [int]szerint jeleníthető meg, akkor ez a típusa.
  • Ellenkező esetben, ha az érték típus [long]szerint ábrázolható, akkor ez a típusa.
  • Ellenkező esetben, ha az érték típus [decimal]szerint ábrázolható, akkor ez a típusa.
  • Ellenkező esetben típus szerint van jelölve [double].

Egész szám típusú utótaggal rendelkező literál esetén:

  • Ha a típus utótagja, u és az érték típus [uint] szerint ábrázolható, akkor a típusa .[uint]
  • Ha a típus utótagja, u és az érték típus [ulong] szerint ábrázolható, akkor a típusa .[ulong]
  • Ha az érték a megadott típus szerint ábrázolható, akkor ez a típusa.
  • Ellenkező esetben a literál helytelenül van formázva.

Valós literálok

A valódi literálok csak decimális jelölésben írhatók. Ez a jelölés a tizedesvesszőt követő törtértékeket és az exponenciális részt használó tudományos jelöléseket is tartalmazhat.

Az exponenciális rész tartalmaz egy "e"-t, amelyet egy választható jel (+/-) és egy szám követ, amely a kitevőt jelöli. A literális érték 1e2 például a 100-nak felel meg.

A valódi literálok típus-utótagokkal és szorzó utótagokkal is rendelkezhetnek.

Toldalék Értelmezés
d decimális adattípus
kb kibibyte (10241) szorzó
mb mebibyte (10242) szorzó
gb gigibyte (10243) szorzó
tb teribyte (10244) szorzó
pb petibyte (10245) szorzó

Kétféle valódi literál létezik: dupla és decimális. Ezeket a tizedes típusú utótag hiánya vagy jelenléte jelzi. A PowerShell nem támogatja az [float] értékek literális ábrázolását. A dupla valós literál típusa [double]. A decimális valódi literál típusa [decimal]. A decimális valós literál törtrészében lévő záró nullák jelentősek.

Ha az exponent-part számjegyeinek értéke egy [double] valós literálban kisebb, mint a minimálisan támogatott érték, akkor a valódi literál értéke [double] 0. Ha az exponent-part számjegyeinek értéke egy [decimal] valós literálban kisebb, mint a minimális támogatott érték, akkor ez a literál helytelenül van formázva. Ha a kitevő-rész számjegyeinek értéke egy [double] vagy [decimal] valós literálban nagyobb, mint a maximális támogatott érték, akkor ez a literál helytelenül van formázva.

Feljegyzés

A szintaxis lehetővé teszi, hogy egy dupla valós literál hosszú típusú utótagot adjon meg. A PowerShell ezt az esetet egész számkonstansként kezeli, amelynek értékét típus [long]jelöli. Ezt a funkciót megőrizték a PowerShell korábbi verzióival való visszamenőleges kompatibilitás érdekében. A programozók azonban nem tudják használni az űrlap egész számkonstansait, mivel könnyen elfedhetik a literál tényleges értékét. Például 1.2L az 1 értéket, 1.2345e1L a 12 értéket, és 1.2345e-5L a 0 értéket, amelyek közül egyik sem azonnal nyilvánvaló.

Numerikus szorzók

A kényelem érdekében az egész szám és a valós literálok tartalmazhatnak numerikus szorzót, amely a 2 gyakran használt hatványok egyikét jelzi. A numerikus szorzó nagybetűk vagy kisbetűk tetszőleges kombinációjában írható.

A szorzó utótagok bármilyen típus-utótaggal együtt használhatók, de a típus utótagja után jelen kell lenniük. A literál 100gbL például helytelenül formázott, de a literál 100Lgb érvényes.

Ha egy szorzó olyan értéket hoz létre, amely meghaladja az utótag által megadott numerikus típus lehetséges értékeit, a literál hibásan formázott lesz. A literál 1usgb például hibásan formázott, mert az érték 1gb nagyobb, mint az utótag által [ushort] megadott típus esetében us megengedett érték.

Példák szorzókra

PS> 1kb
1024

PS> 1.30Dmb
1363148.80

PS> 0x10Gb
17179869184

PS> 1.4e23tb
1.5393162788864E+35

PS> 0x12Lpb
20266198323167232

Numerikus típusú gyorsítók

A PowerShell a következő típusgyorsítókat támogatja:

Gázpedál Feljegyzés Leírás
[byte] Bájt (aláíratlan)
[sbyte] Bájt (aláírt)
[int16] 16 bites egész szám
[short] alias a következőhöz: [int16] 16 bites egész szám
[uint16] 16 bites egész szám (aláíratlan)
[ushort] alias a következőhöz: [uint16] 16 bites egész szám (aláíratlan)
[int32] 32 bites egész szám
[int] alias a következőhöz: [int32] 32 bites egész szám
[uint32] 32 bites egész szám (aláíratlan)
[uint] alias a következőhöz: [uint32] 32 bites egész szám (aláíratlan)
[int64] 64 bites egész szám
[long] alias a következőhöz: [int64] 64 bites egész szám
[uint64] 64 bites egész szám (aláíratlan)
[ulong] alias a következőhöz: [uint64] 64 bites egész szám (aláíratlan)
[bigint] Lásd: BigInteger Struct
[single] Egyetlen pontosságú lebegőpontos
[float] alias a következőhöz: [single] Egyetlen pontosságú lebegőpontos
[double] Dupla pontosságú lebegőpontos
[decimal] 128 bites lebegőpontos

Feljegyzés

A Következő típusgyorsítók lettek hozzáadva a PowerShell 6.2-ben: [short], [ushort], , [uint][ulong].

Példák

Az alábbi táblázat számos példát tartalmaz a numerikus literálokra, és felsorolja azok típusát és értékét:

Szám Típus Érték
100 Int32 100
100u UInt32 100
100D Decimális 100
100l Int64 100
100uL UInt64 100
100us UInt16 100
100uy Bájt 100
100y SByte 100
1e2 Kétszeres 100
1.e2 Kétszeres 100
0x1e2 Int32 482
0x1e2L Int64 482
0x1e2D Int32 7725
482D Decimális 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

Bináris vagy hexadecimális számok használata

A túl nagy bináris vagy hexadecimális literálok ahelyett, [bigint] hogy az elemzést meghiúsulnák, ha és csak akkor, ha az n utótag meg van adva. A jelbitek továbbra is a páros [decimal] tartományok felett vannak tiszteletben tartva, azonban:

  • Ha egy bináris sztring 8 bites többszöröse, a legnagyobb bitet a jelbitként kezeli a függvény.
  • Ha egy 8-as többszörös hosszúságú hexa sztring első számjegye 8 vagy annál magasabb, a szám negatívként lesz kezelve.

A bináris és a hexa literálok alá nem írt utótagjának megadása figyelmen kívül hagyja a jelbiteket. Visszaadja például a 0xFFFFFFFF-10xFFFFFFFFu[uint]::MaxValue 4294967295 értékét.

A PowerShell 7.1-ben a hexa-literál típus-utótagja mostantól egy ilyen típusú aláírt értéket ad vissza. A PowerShell 7.0-ban például a kifejezés 0xFFFFs hibát ad vissza, mert a pozitív érték túl nagy egy [int16] típushoz. A PowerShell 7.1 ezt egy típusként -1[int16] értelmezi.

A konstans 0 előtagja ezt megkerüli, és aláíratlanként lesz kezelve. Például: 0b011111111 Erre akkor lehet szükség, ha a [bigint] tartományban lévő literálokkal dolgozik, mivel az és u az n utótagok nem kombinálhatók.

Az előtaggal - bináris és hexa literálokat is tagadhat. Ez pozitív számot eredményezhet, mivel a jelbitek engedélyezettek.

A BigInteger-utótagú számokhoz a rendszer aláírási biteket fogad el:

  • A BigInteger utótagú hexa minden literál nagy bitjét 8 karakter hosszúságú jelbitként kezeli. A hossz nem tartalmazza az 0x előtagot vagy az utótagokat.
  • A BigInteger utótagú bináris 96 és 128 karakternél, utána pedig 8 karakterenként fogadja el a jelbiteket.

Numerikus típus konvertálása

Ha a sztringeket számokká konvertálja, további hexadecimális formátumjelzők támogatottak. Ezeket a további formátumokat a rendszer nem ismeri fel literálként.

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

Numerikus literálokhoz hasonló parancsok

Az érvényes számkonstansnak tűnő parancsokat a hívó operátorral (&) kell végrehajtani, ellenkező esetben számként kell értelmezni. Az érvényes szintaxissal 1usgb rendelkező hibásan formázott literálok a következő hibát eredményezik:

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

Az érvénytelen szintaxisú 1gbus hibásan formázott literálok azonban szabványos, csupasz sztringként lesznek értelmezve, és érvényes parancsnévként értelmezhetők olyan környezetekben, ahol parancsok hívhatók meg.

Numerikus objektumok hozzáférési tulajdonságai és metódusai

A numerikus literál egy tagjának eléréséhez vannak olyan esetek, amikor zárójelbe kell helyeznie a literálist.

  • A literál nem rendelkezik tizedesvesszővel
  • A literál nem tartalmaz számjegyeket a tizedesvessző után
  • A literálnak nincs utótagja

A következő példa például meghiúsul:

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

A következő példák működnek:

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

Az első két példa a konstans érték zárójelbe helyezése nélkül működik, mivel a PowerShell-elemző meg tudja határozni, hogy hol végződik a számkonstans, és hol kezdődik a GetType metódus.

Numerikus literálok elemzése a PowerShellben

A PowerShell 7.0-s verzióban módosította a numerikus literálok elemzésének módját az új funkciók engedélyezéséhez.

Valós numerikus literálok elemzése

Ha a literál tizedesvesszőt vagy e-jelölést tartalmaz, a literális sztring valós számként lesz elemezve.

  • Ha a decimális utótag jelen van, akkor közvetlenül a következőbe: [decimal].
  • Máskülönben elemezni kell a szorzót [double] , és szorzót kell alkalmazni az értékre. Ezután ellenőrizze a típus utótagokat, és próbálkozzon a megfelelő típusba való beírással.
  • Ha a sztring nem tartalmaz típus-utótagot, akkor elemezni kell a következőt [double]: .

Egész számkonstansok elemzése

Az egész szám típusú literálok elemzése a következő lépésekkel történik:

  1. A radix formátumának meghatározása
    • Bináris formátumok esetén elemezd a következőt [bigint]: .
    • Hexadecimális formátumok esetén speciális [bigint] eseteket használva őrizze meg az eredeti viselkedést, ha az érték a [int] tartományban van [long] .
    • Ha sem bináris, sem hexa nem, akkor általában elemezni kell a [bigint].
  2. Alkalmazza a szorzóértéket, mielőtt bármilyen öntöttel próbálkozik, hogy a típushatárok megfelelően ellenőrizhetők legyenek túlcsordulások nélkül.
  3. Ellenőrizze a típus utótagját.
    • Ellenőrizze a típushatárokat, és próbálja meg elemezni ezt a típust.
    • Ha nem használ utótagot, akkor az érték a következő sorrendben van bejelölve, így az első sikeres teszt határozza meg a szám típusát.
      • [int]
      • [long]
      • [decimal] (csak alap-10 literál)
      • [double] (csak alap-10 literál)
    • Ha az érték kívül esik a [long] hexa és a bináris számok tartományán, az elemzés meghiúsul.
    • Ha az érték a 10-es alapérték tartományán kívül [double] esik, az elemzés sikertelen lesz.
    • A magasabb értékeket explicit módon kell írni az utótag használatával a n literál BigIntegerelemzéséhez.

Nagy értékű literálok elemzése

Korábban a magasabb egész számértékeket dupla értékként elemeztük, mielőtt bármilyen más típusba öntötték volna őket. Ez a pontosság csökkenését eredményezi a magasabb tartományokban. Példa:

PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904

A probléma elkerülése érdekében sztringekként kellett írnia az értékeket, majd konvertálnia kell őket:

PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111

A PowerShell 7.0-ban az N utótagot kell használnia.

PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111

A pontosság fenntartása érdekében a decimális utótagot [ulong]::MaxValue használva is meg kell jelölni az értékeket.[decimal]::MaxValueD Az utótag nélkül ezek az értékek valós elemzési módként lesznek elemezve [double] .