当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于数字文字

作者:精品下载站 日期:2024-12-14 02:21:24 浏览:14 分类:玩电脑

关于数字文字


简短描述

本文介绍 PowerShell 中数值的语法和用法。

详细描述

有两种数字文字:整数和实数。两者都可以有类型和乘数后缀。

整数文字

整数文字可以用十进制、十六进制或二进制表示法书写。十六进制文字以 0x 为前缀,二进制文字以 0b 为前缀,以区别于十进制数字。

整数文字可以具有类型后缀和乘数后缀。

Suffix Meaning Note y signed byte data type Added in PowerShell 6.2 uy unsigned byte data type Added in PowerShell 6.2 s short data type Added in PowerShell 6.2 us unsigned short data type Added in PowerShell 6.2 l long data type u unsigned int or long data type Added in PowerShell 6.2 ul unsigned long data type Added in PowerShell 6.2 n BigInteger data type Added in PowerShell 7.0 kb kilobyte multiplier mb megabyte multiplier gb gigabyte multiplier tb terabyte multiplier pb petabyte multiplier

整数文字的类型由其值、类型后缀和数字乘数后缀确定。

对于没有类型后缀的整数文字:

  • 如果该值可以用类型[int]表示,那就是它的类型。
  • 否则,如果该值可以用 [long] 类型表示,那就是它的类型。
  • 否则,如果该值可以用[decimal]类型表示,那就是它的类型。
  • 否则,它由类型 [double] 表示。

对于带有类型后缀的整数文字:

  • 如果类型后缀为 u 并且该值可以用 [uint] 类型表示,则其类型为 [uint]
  • 如果类型后缀为 u 并且该值可以用 [ulong] 类型表示,则其类型为 [ulong]
  • 如果它的值可以用指定的类型表示,那么这就是它的类型。
  • 否则,该文字的格式是错误的。

真实文字

实数只能用十进制表示。此表示法可以包括小数点后面的分数值和使用指数部分的科学记数法。

指数部分包括“e”,后跟可选符号 (+/-) 和代表指数的数字。例如,文字值 1e2 等于数值 100。

实数可以有类型后缀和乘数后缀。

d

小数数据类型

kb

千字节乘数

mb

兆字节乘数

gb

千兆字节乘数

tb

太字节乘数

pb

拍字节乘数

实数有两种:双精度型和十进制型。这些分别通过十进制类型后缀的不存在或存在来指示。 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] 类型所允许的值。代码>我们后缀。

乘数示例

PS> 1kb
1024

PS> 1.30Dmb
1363148.80

PS> 0x10Gb
17179869184

PS> 1.4e23tb
1.5393162788864E+35

PS> 0x12Lpb
20266198323167232

数字类型加速器

PowerShell 支持以下类型加速器:

Accelerator Note Description [byte] Byte (unsigned) [sbyte] Byte (signed) [Int16] 16-bit integer [short] alias for [int16] 16-bit integer [UInt16] 16-bit integer (unsigned) [ushort] alias for [uint16] 16-bit integer (unsigned) [Int32] 32-bit integer [int] alias for [int32] 32-bit integer [UInt32] 32-bit integer (unsigned) [uint] alias for [uint32] 32-bit integer (unsigned) [Int64] 64-bit integer [long] alias for [int64] 64-bit integer [UInt64] 64-bit integer (unsigned) [ulong] alias for [uint64] 64-bit integer (unsigned) [bigint] See BigInteger Struct [single] Single precision floating point [float] alias for [single] Single precision floating point [double] Double precision floating point [decimal] 128-bit floating point

笔记

PowerShell 6.2 中添加了以下类型加速器:[short][ushort][uint][ulong]

示例

下表包含数字文字的几个示例并列出了它们的类型和值:

Number Type Value 100 Int32 100 100u UInt32 100 100D Decimal 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 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

使用二进制或十六进制数字

当且仅当指定了 n 后缀时,过大的二进制或十六进制文字可以作为 [bigint] 返回,而不是导致解析失败。然而,即使在 [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] 范围内的文字时,这可能是必要的,因为 un 后缀无法组合。

您还可以使用 - 前缀对二进制和十六进制文字取反。由于允许符号位,因此这可能会导致正数。

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 v7.0 更改了解析数字文字的方式以启用新功能。

解析真实的数字文字

如果文字包含小数点或电子表示法,则文字字符串将被解析为实数。

  • 如果存在小数后缀,则直接进入[decimal]
  • 否则,解析为 [Double] 并对值应用乘数。然后检查类型后缀并尝试转换为适当的类型。
  • 如果字符串没有类型后缀,则解析为[Double]

解析整数数字文字

使用以下步骤解析整数类型文字:

  1. 确定基数格式

    • 对于二进制格式,解析为[BigInteger]
  2. 对于十六进制格式,当值位于 [int][long] 中时,使用特殊的 casies 解析为 [BigInteger] 以保留原始行为范围。
  3. 如果既不是二进制也不是十六进制,则通常解析为 [BigInteger]
  4. 在尝试任何强制转换之前应用乘数值,以确保可以正确检查类型边界而不会溢出。
  5. 检查类型后缀。

    • 检查类型边界并尝试解析为该类型。
  6. 如果不使用后缀,则按以下顺序对值进行边界检查,从而导致第一次成功的测试确定数字的类型。

      [int]
    • [long]
    • [十进制](仅限以 10 为基数的文字)
    • [double](仅限以 10 为基数的文字)
    • 如果该值超出十六进制和二进制数的[long]范围,则解析失败。
    • 如果该值超出以 10 为基数的 [double] 范围,则解析失败。
    • 必须使用 n 后缀显式写入更高的值,才能将文字解析为 BigInteger

    解析大值文字

    以前,较高的整数值在转换为任何其他类型之前会被解析为 double。这会导致较高范围内的精度损失。例如:

    PS> [bigint]111111111111111111111111111111111111111111111111111111
    111111111111111100905595216014112456735339620444667904
    

    为了避免这个问题,您必须将值写入字符串,然后将它们转换:

    PS> [bigint]'111111111111111111111111111111111111111111111111111111'
    111111111111111111111111111111111111111111111111111111
    

    在 PowerShell 7.0 中,您必须使用 N 后缀。

    PS> 111111111111111111111111111111111111111111111111111111n
    111111111111111111111111111111111111111111111111111111
    

    此外,[ulong]::MaxValue[decimal]::MaxValue 之间的值应使用小数后缀 D 表示,以保持准确性。如果没有后缀,这些值将使用实数解析模式解析为 [Double]

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯