about_Numeric_Literals
Descrição breve
Este artigo descreve a sintaxe e o uso de valores numéricos no PowerShell.
Descrição longa
Existem dois tipos de literais numéricos: inteiros e reais. Ambos podem ter sufixos de tipo e multiplicador.
Literais inteiros
Os literais inteiros podem ser escritos em notação decimal, hexadecimal ou binária.
Os literais hexadecimais são prefixados com 0x
e os literais binários são prefixados com 0b
para distingui-los dos números decimais.
Os literais inteiros podem ter um sufixo de tipo e um sufixo multiplicador.
Sufixo | Significado | Observação |
---|---|---|
y |
Tipo de dados de byte assinado | Adicionado no PowerShell 6.2 |
uy |
Tipo de dados de byte não assinado | Adicionado no PowerShell 6.2 |
s |
Tipo de dados curto | Adicionado no PowerShell 6.2 |
us |
Tipo de dados curto não assinado | Adicionado no PowerShell 6.2 |
l |
Tipo de dados longo | |
u |
tipo de dados int ou long não assinado | Adicionado no PowerShell 6.2 |
ul |
Tipo de dados longo não assinado | Adicionado no PowerShell 6.2 |
n |
Tipo de dados BigInteger | Adicionado no PowerShell 7.0 |
kb |
Multiplicador de Kibibyte (10241) | |
mb |
Multiplicador de mebibytes (10242) | |
gb |
Gigibyte (10243) Multiplicador | |
tb |
multiplicador teribyte (10244) | |
pb |
Multiplicador de petibytes (10245) |
O tipo de um literal inteiro é determinado por seu valor, o sufixo de tipo e o sufixo do multiplicador numérico.
Para um literal inteiro sem sufixo de tipo:
- Se o valor puder ser representado pelo tipo
[int]
, esse é o seu tipo. - Caso contrário, se o valor puder ser representado pelo tipo
[long]
, esse é o seu tipo. - Caso contrário, se o valor puder ser representado pelo tipo
[decimal]
, esse é o seu tipo. - Caso contrário, ele é representado pelo tipo
[double]
.
Para um literal inteiro com um sufixo de tipo:
- Se o sufixo de tipo for
u
e o valor puder ser representado por tipo[uint]
, então seu tipo é[uint]
. - Se o sufixo de tipo for
u
e o valor puder ser representado por tipo[ulong]
, então seu tipo é[ulong]
. - Se seu valor puder ser representado pelo tipo especificado, esse será o seu tipo.
- Caso contrário, esse literal será malformado.
Literais reais
Literais reais só podem ser escritos em notação decimal. Essa notação pode incluir valores fracionários após um ponto decimal e notação científica usando uma parte exponencial.
A parte exponencial inclui um 'e' seguido por um sinal opcional (+/-) e um número que representa o expoente. Por exemplo, o valor 1e2
literal é igual ao valor numérico 100.
Literais reais podem ter um sufixo de tipo e um sufixo multiplicador.
Sufixo | Significado |
---|---|
d |
tipo de dados decimal |
kb |
Multiplicador de Kibibyte (10241) |
mb |
Multiplicador de mebibytes (10242) |
gb |
Gigibyte (10243) Multiplicador |
tb |
multiplicador teribyte (10244) |
pb |
Multiplicador de petibytes (10245) |
Há dois tipos de literal real: double e decimal. Estes são indicados pela ausência ou presença, respectivamente, de sufixo do tipo decimal. O PowerShell não dá suporte a uma representação literal de um [float]
valor. Um literal real duplo tem tipo [double]
. Um literal real decimal tem o tipo [decimal]
.
Zeros à direita na parte fracionária de um literal real decimal são significativos.
Se o valor dos dígitos da parte do expoente em um [double]
literal real for menor que o mínimo suportado, o valor desse [double]
literal real será 0. Se o valor dos dígitos da parte do expoente em um [decimal]
literal real for menor que o mínimo suportado, esse literal estará malformado. Se o valor dos dígitos da parte do expoente em um [double]
literal real ou [decimal]
for maior que o máximo suportado, esse literal estará malformado.
Observação
A sintaxe permite que um literal real duplo tenha um sufixo de tipo longo.
O PowerShell trata esse caso como um literal inteiro cujo valor é representado pelo tipo [long]
. Esse recurso foi mantido para fins de compatibilidade com versões anteriores do PowerShell. No entanto, os programadores são desencorajados de usar literais inteiros desse formulário, pois podem facilmente obscurecer o valor real do literal. Por exemplo, 1.2L
tem valor 1, 1.2345e1L
tem valor 12 e 1.2345e-5L
tem valor 0, nenhum dos quais é imediatamente óbvio.
Multiplicadores numéricos
Por conveniência, literais inteiros e reais podem conter um multiplicador numérico, que indica um de um conjunto de potências comumente usadas de 2. O multiplicador numérico pode ser escrito em qualquer combinação de letras maiúsculas ou minúsculas.
Os sufixos multiplicadores podem ser usados em combinação com qualquer sufixo de tipo, mas devem estar presentes após o sufixo de tipo. Por exemplo, o literal 100gbL
está malformado, mas o literal 100Lgb
é válido.
Se um multiplicador criar um valor que exceda os valores possíveis para o tipo numérico especificado pelo sufixo, o literal será malformado. Por exemplo, o literal 1usgb
está malformado, pois o valor 1gb
é maior do que o permitido para o [ushort]
tipo especificado pelo us
sufixo.
Exemplos de multiplicadores
PS> 1kb
1024
PS> 1.30Dmb
1363148.80
PS> 0x10Gb
17179869184
PS> 1.4e23tb
1.5393162788864E+35
PS> 0x12Lpb
20266198323167232
Aceleradores de tipo numérico
O PowerShell dá suporte aos seguintes aceleradores de tipo:
Acelerador | Observação | Descrição |
---|---|---|
[byte] |
Byte (sem sinal) | |
[sbyte] |
Byte (assinado) | |
[Int16] |
Inteiro de 16 bits | |
[short] |
alias para [int16] |
Inteiro de 16 bits |
[UInt16] |
Inteiro de 16 bits (sem sinal) | |
[ushort] |
alias para [uint16] |
Inteiro de 16 bits (sem sinal) |
[Int32] |
Inteiro de 32 bits | |
[int] |
alias para [int32] |
Inteiro de 32 bits |
[UInt32] |
Inteiro de 32 bits (sem sinal) | |
[uint] |
alias para [uint32] |
Inteiro de 32 bits (sem sinal) |
[Int64] |
Inteiro de 64 bits | |
[long] |
alias para [int64] |
Inteiro de 64 bits |
[UInt64] |
Inteiro de 64 bits (sem sinal) | |
[ulong] |
alias para [uint64] |
Inteiro de 64 bits (sem sinal) |
[bigint] |
Consulte BigInteger Struct | |
[single] |
Ponto flutuante de precisão única | |
[float] |
alias para [single] |
Ponto flutuante de precisão única |
[double] |
Ponto flutuante de dupla precisão | |
[decimal] |
Ponto flutuante de 128 bits |
Observação
Os seguintes aceleradores de tipo foram adicionados no PowerShell 6.2: [short]
, [ushort]
, [uint]
, [ulong]
.
Exemplos
A tabela a seguir contém vários exemplos de literais numéricos e lista seu tipo e valor:
Número | Tipo | Valor |
---|---|---|
100 | Int32 | 100 |
100u | UInt32 | 100 |
100D | Decimal | 100 |
100l | Int64 | 100 |
100uL | UInt64 | 100 |
100 nós | UInt16 | 100 |
100uy | Byte | 100 |
100 anos | SByte | 100 |
1e2 | Double | 100 |
1.e2 | Double | 100 |
0x1e2 | Int32 | 482 |
0x1e2L | Int64 | 482 |
0x1e2D | Int32 | 7725 |
482D | Decimal | 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 |
Trabalhando com números binários ou hexadecimais
Literais binários ou hexadecimais excessivamente grandes podem retornar como [bigint]
em vez de falhar na análise, se e somente se o n
sufixo for especificado. No entanto, os bits de sinal ainda são respeitados acima de intervalos pares [decimal]
:
- Se uma string binária tiver um múltiplo de 8 bits, o bit mais alto será tratado como o bit de sinal.
- Se uma string hexadecimal, que tem um comprimento múltiplo de 8, tiver o primeiro dígito com 8 ou superior, o numeral será tratado como negativo.
Especificar um sufixo sem sinal em literais binários e hexadecimais ignora bits de sinal. Por exemplo, 0xFFFFFFFF
retorna -1
, mas 0xFFFFFFFFu
retorna o [uint]::MaxValue
de 4294967295.
No PowerShell 7.1, o uso de um sufixo de tipo em um literal hexadecimal agora retorna um valor assinado desse tipo. Por exemplo, no PowerShell 7.0, a expressão 0xFFFFs
retorna um erro porque o valor positivo é muito grande para um [int16]
tipo.
O PowerShell 7.1 interpreta isso como -1
um [int16]
tipo.
Prefixar o literal com um 0
ignorará isso e será tratado como não assinado.
Por exemplo: 0b011111111
. Isso pode ser necessário ao trabalhar com literais no [bigint]
intervalo, pois os sufixos e u
n
não podem ser combinados.
Você também pode negar literais binários e hexadecimais usando o prefixo -
. Isso pode resultar em um número positivo, pois os bits de sinal são permitidos.
Os bits de sinal são aceitos para numerais com sufixo BigInteger:
- O hexadecimal com sufixo BigInteger trata o bit alto de qualquer literal com um múltiplo de comprimento de 8 caracteres como o bit de sinal. O comprimento não inclui o prefixo
0x
ou quaisquer sufixos. - O binário com sufixo BigInteger aceita bits de sinal em 96 e 128 caracteres e a cada 8 caracteres depois.
Conversão de tipo numérico
Quando as cadeias de caracteres são convertidas em números, há suporte para indicadores de formato hexadecimal adicionais. Esses formatos adicionais não são reconhecidos como literais.
[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF
[int] '0b1111' -eq 0b1111
[int] '0b1111' -eq 15
Comandos que se parecem com literais numéricos
Qualquer comando que se pareça com um literal numérico válido deve ser executado usando o operador de chamada (&
), caso contrário, ele será interpretado como um número. Literais malformados com sintaxe válida como 1usgb
resultarão no seguinte erro:
PS> 1usgb
At line:1 char:6
+ 1usgb
+ ~
The numeric constant 1usgb is not valid.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant
No entanto, literais malformados com sintaxe inválida como 1gbus
serão interpretados como uma cadeia de caracteres padrão e podem ser interpretados como um nome de comando válido em contextos em que os comandos podem ser chamados.
Propriedades de acesso e métodos de objetos numéricos
Para acessar um membro de um literal numérico, há casos em que você precisa colocar o literal entre parênteses.
- O literal não tem um ponto decimal
- O literal não tem nenhum dígito após o ponto decimal
- O literal não tem um sufixo
Por exemplo, o exemplo a seguir falha:
PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+ ~
An expression was expected after '('.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression
Os exemplos a seguir funcionam:
PS> 2uL.GetType().Name
UInt64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32
Os dois primeiros exemplos funcionam sem colocar o valor literal entre parênteses porque o analisador do PowerShell pode determinar onde o literal numérico termina e o método GetType começa.
Como o PowerShell analisa literais numéricos
O PowerShell v7.0 alterou a maneira como os literais numéricos são analisados para habilitar os novos recursos.
Analisando literais numéricos reais
Se o literal contiver um ponto decimal ou a notação e, a cadeia de caracteres literal será analisada como um número real.
- Se o sufixo decimal estiver presente, diretamente em
[decimal]
. - Caso contrário, analise como
[Double]
e aplique o multiplicador ao valor. Em seguida, verifique os sufixos de tipo e tente converter no tipo apropriado. - Se a string não tiver sufixo de tipo, analise como
[Double]
.
Analisando literais numéricos inteiros
Os literais do tipo inteiro são analisados usando as seguintes etapas:
- Determinar o formato da base
- Para formatos binários, analise em
[BigInteger]
. - Para formatos hexadecimais, analise o uso de
[BigInteger]
casos especiais para manter os[int]
comportamentos originais quando o valor estiver no intervalo ou[long]
. - Se não for binário nem hexadecimal, analise normalmente como um
[BigInteger]
.
- Para formatos binários, analise em
- Aplique o valor do multiplicador antes de tentar qualquer conversão para garantir que os limites de tipo possam ser verificados adequadamente sem estouros.
- Verifique os sufixos de tipo.
- Verifique os limites de tipo e tente analisar esse tipo.
- Se nenhum sufixo for usado, o valor será verificado na ordem a seguir, resultando no primeiro teste bem-sucedido determinando o tipo do número.
[int]
[long]
[decimal]
(somente literais de base 10)[double]
(somente literais de base 10)
- Se o valor estiver fora do
[long]
intervalo para números hexadecimais e binários, a análise falhará. - Se o valor estiver fora do intervalo para o
[double]
número de base 10, a análise falhará. - Valores mais altos devem ser escritos explicitamente usando o
n
sufixo para analisar o literal como umBigInteger
.
Analisando literais de valor grande
Anteriormente, valores inteiros mais altos eram analisados como double antes de serem convertidos em qualquer outro tipo. Isso resulta em uma perda de precisão nas faixas mais altas. Por exemplo:
PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904
Para evitar esse problema, você teve que escrever valores como strings e depois convertê-los:
PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111
No PowerShell 7.0, você deve usar o N
sufixo.
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
Além disso, os valores entre [ulong]::MaxValue
e [decimal]::MaxValue
devem ser indicados usando o sufixo D
decimal para manter a precisão. Sem o sufixo, esses valores são analisados como [Double]
usando o modo de análise real.