Поделиться через


Сведения о числовых литералах

Краткое описание

В этой статье описывается синтаксис и использование числовых значений в 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 умножение килобайта
mb Умножение мегабайта
gb умножение гигабайт
tb умножение терабайтов
pb мультипликатор petabyte

Тип целочисленного литерала определяется его значением, суффиксом типа и числовым суффиксом умножения.

Для целочисленного литерала без суффикса типа:

  • Если значение может быть представлено по типу [int], то это его тип.
  • В противном случае, если значение может быть представлено по типу [long], то есть его тип.
  • В противном случае, если значение может быть представлено по типу [decimal], то есть его тип.
  • В противном случае он представлен типом [double].

Для целочисленного литерала с суффиксом типа:

  • Если суффикс типа и u значение может быть представлено по типу [uint] , то его тип равен [uint].
  • Если суффикс типа и u значение может быть представлено по типу [ulong] , то его тип равен [ulong].
  • Если его значение может быть представлено типом, указанным, то это его тип.
  • В противном случае этот литерал неправильно сформирован.

Вещественные литералы

Реальные литералы могут быть записаны только в десятичной нотации. Эта нотация может включать дробные значения после десятичной запятой и научной нотации с помощью экспоненциальной части.

Экспоненциальная часть включает "e", за которым следует необязательный знак (+/-) и число, представляющее экспонент. Например, литеральное значение 1e2 равно числовое значение 100.

Реальные литералы могут иметь суффикс типа и суффикс умножения.

Суффикс Значение
d тип данных decimal
kb умножение килобайта
mb Умножение мегабайта
gb умножение гигабайт
tb умножение терабайтов
pb мультипликатор petabyte

Существует два вида вещественных литералов: 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. Числовое умножение может быть записано в любом сочетании верхних или строчных букв.

Суффиксы умножения могут использоваться в сочетании с суффиксами типа, но должны присутствовать после суффикса типа. Например, литерал неправильно сформирован, но литерал 100gbL100Lgb является допустимым.

Если умножение создает значение, превышающее возможные значения числового типа, указанного суффиксом, литерал неправильно сформирован. Например, литерал 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].

Синтаксический анализ целых числовых литералов

Литералы целочисленного типа анализируются с помощью следующих действий:

  1. Определение формата радикса
    • Для двоичных форматов синтаксический анализ [BigInteger]в .
    • Для шестнадцатеричных форматов можно проанализировать [BigInteger] использование специальных касс для сохранения исходного поведения, если значение находится в диапазоне или [long] в диапазоне[int].
    • Если ни двоичный, ни шестнадцатеричный, анализ обычно не выполняется в виде [BigInteger].
  2. Примените значение умножения перед попыткой приведения, чтобы убедиться, что границы типов можно соответствующим образом проверка без переполнения.
  3. Проверьте суффиксы типов.
    • Проверьте границы типов и попытайтесь проанализировать этот тип.
    • Если суффикс не используется, то значение привязано к проверка в следующем порядке, в результате чего первый успешный тест определяет тип числа.
      • [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] использование режима реального синтаксического анализа.