about_Numeric_Literals

Descrizione breve

Questo articolo descrive la sintassi e l'utilizzo dei valori numerici in PowerShell.

Descrizione lunga

Esistono due tipi di valori letterali numerici: integer e real. Entrambi possono avere suffissi di tipo e moltiplicatore.

Valori letterali Integer

I valori letterali integer possono essere scritti in notazione decimale, esadecimale o binaria. I valori letterali esadecimali sono preceduti 0x da e i valori letterali binari sono preceduti dal prefisso 0b per distinguerli dai numeri decimali.

I valori letterali integer possono avere un suffisso di tipo e un suffisso moltiplicatore.

Suffisso Significato Nota
y tipo di dati con byte firmato Aggiunta in PowerShell 6.2
uy tipo di dati unsigned byte Aggiunta in PowerShell 6.2
s tipo di dati short Aggiunta in PowerShell 6.2
us tipo di dati unsigned short Aggiunta in PowerShell 6.2
l tipo di dati long
u tipo di dati unsigned int o long Aggiunta in PowerShell 6.2
ul tipo di dati long senza segno Aggiunta in PowerShell 6.2
n Tipo di dati BigInteger Aggiunta in PowerShell 7.0
kb moltiplicatore kilobyte
mb moltiplicatore megabyte
gb moltiplicatore gigabyte
tb Moltiplicatore terabyte
pb moltiplicatore petabyte

Il tipo di un valore letterale integer è determinato dal relativo valore, dal suffisso del tipo e dal suffisso numerico del moltiplicatore.

Per un valore letterale integer senza suffisso di tipo:

  • Se il valore può essere rappresentato dal tipo [int], ovvero il relativo tipo.
  • In caso contrario, se il valore può essere rappresentato dal tipo [long], ovvero il relativo tipo.
  • In caso contrario, se il valore può essere rappresentato dal tipo [decimal], ovvero il relativo tipo.
  • In caso contrario, è rappresentato dal tipo [double].

Per un valore letterale integer con un suffisso di tipo:

  • Se il suffisso di tipo è u e il valore può essere rappresentato dal tipo [uint] , il relativo tipo è [uint].
  • Se il suffisso di tipo è u e il valore può essere rappresentato dal tipo [ulong] , il relativo tipo è [ulong].
  • Se il valore può essere rappresentato dal tipo specificato, questo è il tipo.
  • In caso contrario, il valore letterale non è valido.

Valori letterali real

I valori letterali reali possono essere scritti solo in notazione decimale. Questa notazione può includere valori frazionari in seguito a una notazione decimale e scientifica usando una parte esponenziale.

La parte esponenziale include un segno 'e' seguito da un segno facoltativo (+/-) e un numero che rappresenta l'esponente. Ad esempio, il valore 1e2 letterale è uguale al valore numerico 100.

I valori letterali reali possono avere un suffisso di tipo e un suffisso moltiplicatore.

Suffisso Significato
d decimal - tipo di dati
kb moltiplicatore kilobyte
mb moltiplicatore megabyte
gb moltiplicatore gigabyte
tb Moltiplicatore terabyte
pb moltiplicatore petabyte

Esistono due tipi di valore letterale reale: double e decimal. Questi sono indicati rispettivamente dall'assenza o dalla presenza del suffisso di tipo decimale. PowerShell non supporta una rappresentazione letterale di un [float] valore. Un valore letterale reale double ha il tipo [double]. Un valore letterale reale decimale ha il tipo [decimal]. Gli zeri finali nella parte frazionaria di un valore letterale reale decimale sono significativi.

Se il valore delle cifre dell'esponente in un [double] valore letterale reale è minore del valore minimo supportato, il valore di tale [double] valore letterale reale è 0. Se il valore delle cifre dell'esponente in un [decimal] valore letterale reale è inferiore al valore minimo supportato, tale valore letterale non è valido. Se il valore delle cifre dell'esponente in un [double] valore letterale reale o [decimal] è maggiore del valore massimo supportato, tale valore letterale non è valido.

Nota

La sintassi consente a un valore letterale reale doppio di avere un suffisso di tipo long. PowerShell considera questo caso come valore letterale integer il cui valore è rappresentato dal tipo [long]. Questa funzionalità è stata mantenuta per garantire la compatibilità con le versioni precedenti di PowerShell. Tuttavia, i programmatori sono sconsigliati di usare valori letterali integer di questo formato perché possono facilmente nascondere il valore effettivo del valore letterale. Ad esempio, 1.2L ha valore 1, 1.2345e1L ha valore 12 e 1.2345e-5L ha valore 0, nessuno dei quali è immediatamente ovvio.

Moltiplicatori numerici

Per praticità, i valori letterali interi e reali possono contenere un moltiplicatore numerico, che indica uno dei poteri di uso comune di 2. Il moltiplicatore numerico può essere scritto in qualsiasi combinazione di lettere maiuscole o minuscole.

I suffissi del moltiplicatore possono essere usati in combinazione con qualsiasi suffisso di tipo, ma devono essere presenti dopo il suffisso di tipo. Ad esempio, il valore letterale 100gbL è in formato non valido, ma il valore letterale 100Lgb è valido.

Se un moltiplicatore crea un valore che supera i valori possibili per il tipo numerico specificato dal suffisso, il valore letterale non è valido. Ad esempio, il valore letterale 1usgb è in formato non valido, perché il valore 1gb è maggiore di quello consentito per il [ushort] tipo specificato dal us suffisso.

Esempi di moltiplicatori

PS> 1kb
1024

PS> 1.30Dmb
1363148.80

PS> 0x10Gb
17179869184

PS> 1.4e23tb
1.5393162788864E+35

PS> 0x12Lpb
20266198323167232

Acceleratori di tipi numerici

PowerShell supporta gli acceleratori di tipo seguenti:

Acceleratore Nota Descrizione
[byte] Byte (senza segno)
[sbyte] Byte (firmato)
[Int16] Intero a 16 bit
[short] alias per [int16] Intero a 16 bit
[UInt16] Intero a 16 bit (senza segno)
[ushort] alias per [uint16] Intero a 16 bit (senza segno)
[Int32] Intero a 32 bit
[int] alias per [int32] Intero a 32 bit
[UInt32] Intero a 32 bit (senza segno)
[uint] alias per [uint32] Intero a 32 bit (senza segno)
[Int64] Integer a 64 bit
[long] alias per [int64] Integer a 64 bit
[UInt64] Intero a 64 bit (senza segno)
[ulong] alias per [uint64] Intero a 64 bit (senza segno)
[bigint] Vedere Struct BigInteger
[single] Singola precisione a virgola mobile
[float] alias per [single] Singola precisione a virgola mobile
[double] Precisione doppia a virgola mobile
[decimal] Virgola mobile a 128 bit

Nota

In PowerShell 6.2 sono stati aggiunti gli acceleratori di tipo seguenti: [short], [ushort], [uint], [ulong].

Esempi

La tabella seguente contiene diversi esempi di valori letterali numerici ed elenca il tipo e il valore:

Numero Type Valore
100 Int32 100
100u UInt32 100
100D Decimale 100
100l Int64 100
100uL UInt64 100
100us UInt16 100
100uy Byte 100
100y SByte 100
1e2 Double 100
1.e2 Double 100
0x1e2 Int32 482
0x1e2L Int64 482
0x1e2D Int32 7725
482D Decimale 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

Uso di numeri binari o esadecimali

I valori letterali binari o esadecimali eccessivamente grandi possono restituire come [bigint] anziché non eseguire l'analisi, se e solo se è specificato il n suffisso. I bit di segno vengono comunque rispettati sopra gli intervalli pari [decimal] , tuttavia:

  • Se una stringa binaria è un multiplo di 8 bit lunghi, il bit più alto viene considerato come bit del segno.
  • Se una stringa esadecimale, che ha una lunghezza che è un multiplo di 8, ha la prima cifra con 8 o superiore, il numero viene considerato negativo.

Se si specifica un suffisso senza segno nei valori letterali binari ed esadecimale, i bit di segno vengono ignorati. Ad esempio, restituisce 0xFFFFFFFF , ma 0xFFFFFFFFu restituisce -1l'oggetto [uint]::MaxValue di 4294967295.

In PowerShell 7.1, l'uso di un suffisso di tipo su un valore letterale esadecimale restituisce ora un valore con segno di tale tipo. Ad esempio, in PowerShell 7.0 l'espressione 0xFFFFs restituisce un errore perché il valore positivo è troppo grande per un [int16] tipo. PowerShell 7.1 interpreta questo tipo come -1[int16] un tipo.

Se si prefissi il valore letterale con un oggetto 0 , verrà ignorato e verrà considerato come senza segno. Ad esempio: 0b011111111. Ciò può essere necessario quando si utilizzano valori letterali nell'intervallo [bigint] , poiché non è possibile combinare i u suffissi e n .

È anche possibile negare valori letterali binari ed esadecimale usando il - prefisso . Questo può comportare un numero positivo poiché sono consentiti bit di segno.

I bit di segno vengono accettati per i numeri con suffisso BigInteger:

  • BigInteger-suffisso esadecimale considera il bit elevato di qualsiasi valore letterale con una lunghezza di più di 8 caratteri come bit del segno. La lunghezza non include il 0x prefisso o i suffissi.
  • BigInteger-suffisso binario accetta bit di segno a 96 e 128 caratteri e a ogni 8 caratteri dopo.

Conversione dei tipi numerici

Quando le stringhe vengono convertite in numeri, sono supportati altri indicatori di formato esadecimale. Tali formati aggiuntivi non vengono riconosciuti come valori letterali.

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

Comandi simili a valori letterali numerici

Qualsiasi comando simile a un valore letterale numerico valido deve essere eseguito usando l'operatore di chiamata (&), altrimenti viene interpretato come numero. I valori letterali in formato non valido con sintassi valida, ad 1usgb esempio, genereranno l'errore seguente:

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

Tuttavia, i valori letterali in formato non valido con sintassi non valida, ad 1gbus esempio, verranno interpretati come stringa bare standard e possono essere interpretati come un nome di comando valido nei contesti in cui è possibile chiamare i comandi.

Accedere a proprietà e metodi di oggetti numerici

Per accedere a un membro di un valore letterale numerico, esistono casi in cui è necessario racchiudere il valore letterale tra parentesi.

  • Il valore letterale non ha un separatore decimale
  • Il valore letterale non ha cifre che seguono il separatore decimale
  • Il valore letterale non ha un suffisso

Ad esempio, l'esempio seguente ha esito negativo:

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

Gli esempi seguenti funzionano:

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

I primi due esempi funzionano senza racchiudere tra parentesi il valore letterale perché il parser di PowerShell può determinare dove termina il valore letterale numerico e inizia il metodo GetType .

Come PowerShell analizza i valori letterali numerici

PowerShell v7.0 ha modificato la modalità di analisi dei valori letterali numerici per abilitare le nuove funzionalità.

Analisi di valori letterali numerici reali

Se il valore letterale contiene un separatore decimale o la notazione e, la stringa letterale viene analizzata come numero reale.

  • Se il suffisso decimale è presente, direttamente in [decimal].
  • In caso contrario, analizzare come [Double] e applicare il moltiplicatore al valore. Controllare quindi i suffissi di tipo e tentare di eseguire il cast nel tipo appropriato.
  • Se la stringa non ha alcun suffisso di tipo, analizzare come [Double].

Analisi di valori letterali numerici integer

I valori letterali di tipo integer vengono analizzati seguendo questa procedura:

  1. Determinare il formato radix
    • Per i formati binari, analizzare in [BigInteger].
    • Per i formati esadecimali, analizzare l'uso [BigInteger] di casi speciali per mantenere i comportamenti originali quando il valore si trova nell'intervallo [int] o [long] .
    • Se né binari né esadecimale, analizzare normalmente come .[BigInteger]
  2. Applicare il valore del moltiplicatore prima di tentare qualsiasi cast per assicurarsi che i limiti di tipo possano essere controllati in modo appropriato senza overflow.
  3. Controllare i suffissi di tipo.
    • Controllare i limiti del tipo e tentare di eseguire l'analisi in tale tipo.
    • Se non viene usato alcun suffisso, il valore viene controllato nell'ordine seguente, determinando il primo test riuscito che determina il tipo del numero.
      • [int]
      • [long]
      • [decimal] (solo valori letterali base 10)
      • [double] (solo valori letterali base 10)
    • Se il valore non è compreso nell'intervallo [long] per i numeri esadecimale e binario, l'analisi ha esito negativo.
    • Se il valore non è compreso nell'intervallo per il [double] numero base 10, l'analisi ha esito negativo.
    • I valori superiori devono essere scritti in modo esplicito usando il n suffisso per analizzare il valore letterale come .BigInteger

Analisi di valori letterali valore di grandi dimensioni

In precedenza, i valori integer più elevati venivano analizzati come double prima di essere sottoposti a cast in qualsiasi altro tipo. Ciò comporta una perdita di precisione negli intervalli più elevati. Ad esempio:

PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904

Per evitare questo problema, è stato necessario scrivere valori come stringhe e quindi convertirli:

PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111

In PowerShell 7.0 è necessario usare il N suffisso .

PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111

I valori compresi tra [ulong]::MaxValue e [decimal]::MaxValue devono essere indicati usando il suffisso D decimale per mantenere l'accuratezza. Senza il suffisso, questi valori vengono analizzati come [Double] usando la modalità di analisi reale.