Сведения о числовых литералах
Краткое описание
В этой статье описывается синтаксис и использование числовых значений в PowerShell.
Подробное описание
Существует два типа числовых литералы: целочисленные и реальные. Оба могут иметь суффиксы типа и умножения.
Целочисленные литералы
Целые литералы могут быть записаны в десятичном, шестнадцатеричном или двоичном нотации.
Шестнадцатеричные литералы префиксируются и 0x
двоичные литералы префиксируются с 0b
префиксом, чтобы отличить их от десятичных чисел.
Целые литералы могут иметь суффикс типа и суффикс умножения.
Суффикс | Значение | Примечание. |
---|---|---|
y |
Тип данных с подписью байтов | Добавлено в PowerShell 6.2 |
uy |
Тип данных unsigned byte | Добавлено в PowerShell 6.2 |
s |
short - тип данных | Добавлено в PowerShell 6.2 |
us |
неподписанный короткий тип данных | Добавлено в PowerShell 6.2 |
l |
длинный тип данных | |
u |
тип данных unsigned int или long | Добавлено в PowerShell 6.2 |
ul |
тип данных unsigned long | Добавлено в PowerShell 6.2 |
n |
Тип данных BigInteger | Добавлено в PowerShell 7.0 |
kb |
kibibyte (10241) умножитель | |
mb |
мебибайт (10242) умножитель | |
gb |
gigibyte (10243) умножитель | |
tb |
teribyte (10244) умножитель | |
pb |
петибайт (10245) умножитель |
Тип целочисленного литерала определяется его значением, суффиксом типа и числовым суффиксом умножения.
Для целочисленного литерала без суффикса типа:
- Если значение может быть представлено по типу
[int]
, то это его тип. - В противном случае, если значение может быть представлено по типу
[long]
, то есть его тип. - В противном случае, если значение может быть представлено по типу
[decimal]
, то есть его тип. - В противном случае он представлен типом
[double]
.
Для целочисленного литерала с суффиксом типа:
- Если суффикс типа и
u
значение может быть представлено по типу[uint]
, то его тип равен[uint]
. - Если суффикс типа и
u
значение может быть представлено по типу[ulong]
, то его тип равен[ulong]
. - Если его значение может быть представлено типом, указанным, то это его тип.
- В противном случае этот литерал неправильно сформирован.
Вещественные литералы
Реальные литералы могут быть записаны только в десятичной нотации. Эта нотация может включать дробные значения после десятичной запятой и научной нотации с помощью экспоненциальной части.
Экспоненциальная часть включает "e", за которым следует необязательный знак (+/-) и число, представляющее экспонент. Например, литеральное значение 1e2
равно числовое значение 100.
Реальные литералы могут иметь суффикс типа и суффикс умножения.
Суффикс | Значение |
---|---|
d |
тип данных decimal |
kb |
kibibyte (10241) умножитель |
mb |
мебибайт (10242) умножитель |
gb |
gigibyte (10243) умножитель |
tb |
teribyte (10244) умножитель |
pb |
петибайт (10245) умножитель |
Существует два вида вещественных литералов: double и decimal. Они указываются отсутствием или присутствием соответственно десятичного суффикса типа. PowerShell не поддерживает литеральное представление [float]
значения. Двойной реальный литерал имеет тип [double]
. Десятичный реальный литерал имеет тип [decimal]
.
В дробной части вещественного десятичного литерала учитываются нули в конце.
Если значение цифр экспонент-части в [double]
реальном литерале меньше минимально поддерживаемого, значение этого [double]
реального литерала равно 0. Если значение цифр экспонент-части в [decimal]
реальном литерале меньше минимально поддерживаемого, то этот литерал неправильно сформирован. Если значение цифр экспонент-части в [double]
или [decimal]
реальном литерале больше максимального поддерживаемого значения, то этот литерал неправильно сформирован.
Примечание.
Синтаксис позволяет двойному реальному литералу иметь суффикс длинного типа.
PowerShell рассматривает этот случай как целочисленный литерал, значение которого представлено типом [long]
. Эта функция была сохранена для обеспечения обратной совместимости с более ранними версиями PowerShell. Однако программистам не рекомендуется использовать целочисленные литералы в этой форме, так как они могут легко скрывать фактическое значение литерала. Например, 1.2L
имеет значение 1, 1.2345e1L
имеет значение 12 и 1.2345e-5L
имеет значение 0, ни одно из которых немедленно не очевидно.
Числовые умножения
Для удобства целые и реальные литералы могут содержать числовое умножение, указывающее один из наборов часто используемых полномочий 2. Числовое умножение может быть записано в любом сочетании верхних или строчных букв.
Суффиксы умножения могут использоваться в сочетании с суффиксами типа, но должны присутствовать после суффикса типа. Например, литерал неправильно сформирован, но литерал 100gbL
100Lgb
является допустимым.
Если умножение создает значение, превышающее возможные значения числового типа, указанного суффиксом, литерал неправильно сформирован. Например, литерал 1usgb
неправильно сформирован, так как значение 1gb
больше, чем то, что разрешено для типа, указанного [ushort]
суффиксом us
.
Примеры умножения
PS> 1kb
1024
PS> 1.30Dmb
1363148.80
PS> 0x10Gb
17179869184
PS> 1.4e23tb
1.5393162788864E+35
PS> 0x12Lpb
20266198323167232
Акселераторы числовых типов
PowerShell поддерживает следующие акселераторы типов:
Accelerator | Примечание. | Description |
---|---|---|
[byte] |
Байт (без знака) | |
[sbyte] |
Байт (подписанный) | |
[Int16] |
16-разрядное целое число | |
[short] |
Псевдоним для [int16] |
16-разрядное целое число |
[UInt16] |
16-разрядное целое число (без знака) | |
[ushort] |
Псевдоним для [uint16] |
16-разрядное целое число (без знака) |
[Int32] |
32-разрядное целое число | |
[int] |
Псевдоним для [int32] |
32-разрядное целое число |
[UInt32] |
32-разрядное целое число (без знака) | |
[uint] |
Псевдоним для [uint32] |
32-разрядное целое число (без знака) |
[Int64] |
64-разрядное целое число | |
[long] |
Псевдоним для [int64] |
64-разрядное целое число |
[UInt64] |
64-разрядное целое число (без знака) | |
[ulong] |
Псевдоним для [uint64] |
64-разрядное целое число (без знака) |
[bigint] |
См . структуру BigInteger | |
[single] |
С плавающей запятой с одной точностью | |
[float] |
Псевдоним для [single] |
С плавающей запятой с одной точностью |
[double] |
Двойная точность с плавающей запятой | |
[decimal] |
128-разрядная плавающая точка |
Примечание.
В PowerShell 6.2 добавлены следующие акселераторы типов: [short]
, [ushort]
, [uint]
. [ulong]
Примеры
В следующей таблице содержится несколько примеров числовых литерала и перечислены их тип и значение:
Число | Тип | значение |
---|---|---|
100 | Int32 | 100 |
100u | UInt32 | 100 |
100D | Десятичное число | 100 |
100l | Int64 | 100 |
100uL | UInt64 | 100 |
100us | UInt16 | 100 |
100uy | Байт | 100 |
100y | SByte | 100 |
1e2 | Двойной | 100 |
1.e2 | Двойной | 100 |
0x1e2 | Int32 | 482 |
0x1e2L | Int64 | 482 |
0x1e2D | Int32 | 7725 |
482D | Десятичное число | 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 |
Работа с двоичными или шестнадцатеричными числами
Слишком большие двоичные или шестнадцатеричные литералы могут возвращаться [bigint]
вместо сбоя синтаксического анализа, если и только если n
задан суффикс. Биты знака по-прежнему уважаются выше даже [decimal]
диапазонов, однако:
- Если двоичная строка составляет несколько из 8 битов, самый высокий бит обрабатывается как бит знака.
- Если шестнадцатеричная строка, которая имеет длину, кратную 8, имеет первую цифру с 8 или более поздней, число считается отрицательным.
Указание суффикса без знака в двоичном и шестнадцатеричном литералах игнорирует биты подписей. Например, возвращается-1
, 0xFFFFFFFF
но 0xFFFFFFFFu
возвращает [uint]::MaxValue
4294967295.
В PowerShell 7.1 использование суффикса типа в шестнадцатеричный литерал теперь возвращает подписанное значение этого типа. Например, в PowerShell 7.0 выражение 0xFFFFs
возвращает ошибку, так как положительное значение слишком велико для [int16]
типа.
PowerShell 7.1 интерпретирует это как -1
[int16]
тип.
Префикс префикса литерала с помощью обхода 0
этого и будет рассматриваться как неподписанный.
Например: 0b011111111
. Это может потребоваться при работе с литералами в диапазоне [bigint]
, так как u
суффиксы и суффиксы n
не могут быть объединены.
Вы также можете отменить двоичные и шестнадцатеричные литералы с помощью -
префикса. Это может привести к положительному числу, так как биты знака разрешены.
Биты знака принимаются для числовых чисел BigInteger-суффиксов:
- BigInteger-суффиксированные шестнадцатеричные значения обрабатывают большой бит любого литерала длиной 8 символов в виде бита знака. Длина не включает
0x
префикс или суффиксы. - BigInteger-суффиксированные двоичные файлы принимают биты знака в 96 и 128 символов и каждые 8 символов после.
Преобразование числовых типов
При преобразовании строк в числа поддерживаются дополнительные шестнадцатеричные индикаторы формата. Эти дополнительные форматы не распознаются как литералы.
[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF
[int] '0b1111' -eq 0b1111
[int] '0b1111' -eq 15
Команды, которые выглядят как числовые литералы
Любая команда, которая выглядит как допустимый числовый литерал, должна выполняться с помощью оператора вызова (&
), в противном случае она интерпретируется как число. Неправильные литералы с допустимым синтаксисом, как 1usgb
и при возникновении следующей ошибки:
PS> 1usgb
At line:1 char:6
+ 1usgb
+ ~
The numeric constant 1usgb is not valid.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant
Однако неправильные литералы с недопустимым синтаксисом, как 1gbus
и обычной строкой, могут быть интерпретированы как допустимое имя команды в контекстах, где могут вызываться команды.
Доступ к свойствам и методам числовых объектов
Чтобы получить доступ к члену числового литерала, существуют случаи, когда необходимо заключить литерал в скобки.
- Литерал не имеет десятичной запятой
- Литерал не имеет цифр после десятичной запятой
- Литерал не имеет суффикса
Например, следующий пример завершается ошибкой:
PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+ ~
An expression was expected after '('.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression
Ниже приведены примеры.
PS> 2uL.GetType().Name
UInt64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32
Первые два примера работают без заключения литерального значения в круглые скобки, так как средство синтаксического анализа PowerShell может определить, где заканчивается числовый литерал и начинается метод GetType .
Анализ числовых литералов PowerShell
PowerShell версии 7.0 изменил способ синтаксического анализа числовых литералов, чтобы включить новые функции.
Анализ реальных числовых литералов
Если литерал содержит десятичную точку или нотацию, то литеральная строка анализируется как реальное число.
- Если десятичный суффикс присутствует, то непосредственно в
[decimal]
. - Кроме того, синтаксический анализ и
[Double]
применение умножения к значению. Затем проверьте суффиксы типа и попытайтесь приведения в соответствующий тип. - Если строка не имеет суффикса типа, выполните синтакс синтакс
[Double]
.
Синтаксический анализ целых числовых литералов
Литералы целочисленного типа анализируются с помощью следующих действий:
- Определение формата радикса
- Для двоичных форматов синтаксический анализ
[BigInteger]
в . - Для шестнадцатеричных форматов можно проанализировать
[BigInteger]
использование специальных случаев, чтобы сохранить исходное поведение, если значение находится в[int]
или[long]
диапазоне. - Если ни двоичный, ни шестнадцатеричный, анализ обычно не выполняется в виде
[BigInteger]
.
- Для двоичных форматов синтаксический анализ
- Примените значение умножения перед попыткой приведения, чтобы убедиться, что границы типов можно проверить соответствующим образом без переполнения.
- Проверьте суффиксы типов.
- Проверьте границы типов и попытайтесь проанализировать этот тип.
- Если суффикс не используется, значение проверяется в следующем порядке, в результате чего первый успешный тест определяет тип числа.
[int]
[long]
[decimal]
(только литералы base-10)[double]
(только литералы base-10)
- Если значение находится за пределами
[long]
диапазона шестнадцатеричных и двоичных чисел, синтаксический анализ завершается ошибкой. - Если значение выходит за пределы
[double]
диапазона для базового 10 числа, синтаксический анализ завершается ошибкой. - Более высокие значения должны быть явно записаны с помощью
n
суффикса для синтаксического анализа литерала в видеBigInteger
.
Анализ больших литералов значений
Ранее более высокие целочисленные значения были проанализированы как двойные перед приведением к любому другому типу. Это приводит к потере точности в более высоких диапазонах. Например:
PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904
Чтобы избежать этой проблемы, необходимо записать значения в виде строк, а затем преобразовать их:
PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111
В PowerShell 7.0 необходимо использовать N
суффикс.
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
Кроме того, значения между [ulong]::MaxValue
и [decimal]::MaxValue
должны быть обозначены с помощью десятичного суффикса D
для поддержания точности. Без суффикса эти значения анализируются как [Double]
использование режима реального синтаксического анализа.
PowerShell