共用方式為


about_Numeric_Literals

簡短描述

本文說明 PowerShell 中數值的語法和使用方式。

詳細描述

數值常值有兩種:integer 和 real。 兩者都可以有類型和乘數後綴。

整數常值

整數常值可以用十進位、十六進位或二進位表示法寫入。 十六進位常值前面會加上 0x ,而二進位常值前面會 0b 加上 ,以區別它們與十進位數。

整數常值可以有類型後綴和乘數後綴。

尾碼 意義 注意
y 帶正負號的位元組數據類型 已在 PowerShell 6.2 中新增
uy unsigned byte 數據類型 已在 PowerShell 6.2 中新增
s short 資料類型 已在 PowerShell 6.2 中新增
us 不帶正負號的簡短數據類型 已在 PowerShell 6.2 中新增
l long 數據類型
u unsigned int 或long資料類型 已在 PowerShell 6.2 中新增
ul 不帶正負號的long數據類型 已在 PowerShell 6.2 中新增
n BigInteger 資料類型 已在 PowerShell 7.0 中新增
kb kbbyte 乘數
mb MB 乘數
gb gbbyte 乘數
tb TB 乘數
pb PB 乘數

整數常值的型別取決於其值、類型後綴和數值乘數後綴。

對於沒有類型後綴的整數常值:

  • 如果值可由 類型 [int]表示,即其類型。
  • 否則,如果值可由 類型 [long]表示,即為其類型。
  • 否則,如果值可由 類型 [decimal]表示,即為其類型。
  • 否則,它會以 類型 [double]表示。

對於具有類型後綴的整數常值:

  • 如果類型後綴是 u ,而且值可以以 類型 [uint] 表示,則其類型為 [uint]
  • 如果類型後綴是 u ,而且值可以以 類型 [ulong] 表示,則其類型為 [ulong]
  • 如果其值可由指定的型別表示,則為其型別。
  • 否則,該常值的格式不正確。

實數常值

實際常值只能以十進位表示法撰寫。 這個表示法可以包含小數點後面的分數值,以及使用指數部分的科學表示法。

指數部分包含 『e』,後面接著選擇性符號 (+/-) 和代表指數的數位。 例如,常值 1e2 等於數值 100。

實際常值可以有類型後綴和乘數後綴。

尾碼 意義
d decimal 資料類型
kb kbbyte 乘數
mb MB 乘數
gb gbbyte 乘數
tb TB 乘數
pb PB 乘數

實際常值有兩種:double 和 decimal。 這些分別以 decimal-type 後綴的不存在或存在表示。 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大於後綴所us指定之型別所允許[ushort]的值。

乘數範例

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 Decimal 100
100l Int64 100
100uL UInt64 100
100us UInt16 100
100uy 位元組 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
0xFFFFF 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-suffixed 數位接受符號位:

  • 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]
    • 針對十六進位格式,剖析成 [BigInteger] 使用特殊大小寫,以在 值位於 [int][long] 範圍內時保留原始行為。
    • 如果二進位和十六進位都不是,則通常剖析為 [BigInteger]
  2. 先套用乘數值,再嘗試任何轉換,以確保可以適當地檢查類型界限,而不會發生溢位。
  3. 檢查類型後綴。
    • 檢查類型界限,並嘗試剖析至該類型。
    • 如果未使用後綴,則值會以下列順序進行界限檢查,導致第一次成功測試判斷數字的類型。
      • [int]
      • [long]
      • [decimal] (僅限base-10常值)
      • [double] (僅限base-10常值)
    • 如果值超出 [long] 十六進位和二進位數的範圍,剖析就會失敗。
    • 如果值超出 [double] 基底 10 數字的範圍,剖析就會失敗。
    • 必須使用 後綴明確寫入 n 較高的值,以剖析常值做為 BigInteger

剖析大型值常值

先前,在轉換成任何其他類型之前,較高的整數值會剖析為 double。 這會導致較高範圍的精確度遺失。 例如:

PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904

若要避免此問題,您必須將值寫入為字串,然後加以轉換:

PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111

在 PowerShell 7.0 中,您必須使用 N 後綴。

PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111

此外,和 [decimal]::MaxValue 之間的[ulong]::MaxValue值應該使用小數後綴D來表示,以維持精確度。 如果沒有後綴,這些值會剖析為 [Double] 使用實際剖析模式。