Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
В этой статье описывается синтаксис и использование числовых значений в PowerShell.
Длинное описание
Существует два типа числовых литералы: целочисленные и реальные. Оба могут иметь суффиксы типа и умножения.
Целые литералы
Целые литералы могут быть записаны в десятичном, шестнадцатеричном или двоичном нотации.
Шестнадцатеричные литералы префиксируются 0x, а двоичные литералы префиксируются 0b, чтобы отличить их от десятичных чисел.
Целые литералы могут иметь суффикс типа и суффикс умножения.
| Суффикс | Значение | Заметка |
|---|---|---|
y |
Тип данных с подписью байтов | Добавлено в PowerShell 6.2 |
uy |
Тип данных unsigned byte | Добавлено в PowerShell 6.2 |
s |
короткий тип данных | Добавлено в 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 |
mebibyte (10242) умножитель | |
gb |
gigibyte (10243) умножитель | |
tb |
teribyte (10244) умножитель | |
pb |
petibyte (10245) умножитель |
Тип целочисленного литерала определяется его значением, суффиксом типа и числовым суффиксом умножения.
Для целочисленного литерала без суффикса типа:
- Если значение может быть представлено по типу
[int], то это его тип. - В противном случае, если значение может быть представлено по типу
[long], то есть его тип. - В противном случае, если значение может быть представлено по типу
[decimal], то есть его тип. - В противном случае он представлен типом
[double].
Для целочисленного литерала с суффиксом типа:
- Если суффикс типа
u, а значение может быть представлено типом[uint], то его тип[uint]. - Если суффикс типа
u, а значение может быть представлено типом[ulong], то его тип[ulong]. - Если его значение может быть представлено типом, указанным, то это его тип.
- В противном случае этот литерал неправильно сформирован.
Реальные литералы
Реальные литералы могут быть записаны только в десятичной нотации. Эта нотация может включать дробные значения после десятичной запятой и научной нотации с помощью экспоненциальной части.
Экспоненциальная часть включает "e", за которым следует необязательный знак (+/-) и число, представляющее экспонент. Например, литеральное значение 1e2 равно числовое значение 100.
Реальные литералы могут иметь суффикс типа и суффикс умножения.
| Суффикс | Значение |
|---|---|
d |
десятичный тип данных |
kb |
kibibyte (10241) умножитель |
mb |
mebibyte (10242) умножитель |
gb |
gigibyte (10243) умножитель |
tb |
teribyte (10244) умножитель |
pb |
petibyte (10245) умножитель |
Существует два типа реального литерала: double и десятично. Они указываются отсутствием или присутствием соответственно десятичного суффикса типа. 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 поддерживает следующие акселераторы типов:
| Акселератор | Заметка | Описание |
|---|---|---|
[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 или более поздней, число считается отрицательным.
Указание суффикса без знака в двоичном и шестнадцатеричном литералах игнорирует биты подписей. Например, 0xFFFFFFFF возвращает -1, но 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].
Синтаксический анализ целых числовых литералов
Литералы целочисленного типа анализируются с помощью следующих действий:
- Определение формата радикса
- Для двоичных форматов синтаксический анализ в
[bigint]. - Для шестнадцатеричных форматов синтаксический анализ в
[bigint]с помощью специальных случаев для сохранения исходного поведения, если значение находится в диапазоне[int]или[long]. - Если ни двоичная, ни шестнадцатеричная, анализ обычно не выполняется как
[bigint].
- Для двоичных форматов синтаксический анализ в
- Примените значение умножения перед попыткой приведения, чтобы убедиться, что границы типов можно проверить соответствующим образом без переполнения.
- Проверьте суффиксы типов.
- Проверьте границы типов и попытайтесь проанализировать этот тип.
- Если суффикс не используется, значение проверяется в следующем порядке, в результате чего первый успешный тест определяет тип числа.
[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