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 kibibyte (10241) 乘數
mb mebibyte (10242) 乘數
gb 吉吉比特 (10243) 乘數
tb teribyte (10244) 乘數
pb petibyte (10245) 乘數

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

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

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

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

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

真實文字

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

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

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

後綴 意義
d decimal 數據類型
kb kibibyte (10241) 乘數
mb mebibyte (10242) 乘數
gb 吉吉比特 (10243) 乘數
tb teribyte (10244) 乘數
pb petibyte (10245) 乘數

實際常值有兩種: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 大於 [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
0xFFFFF Int16 -1
0xFFFFFFFF Int32 -1
-0xFFFFFFFF Int32 1
0xFFFFFFFFu UInt32 4294967295

使用二進位或十六進位數位

如果指定了 [bigint] 後綴,則過大的二進位或十六進位常值可以傳回為 n,而不是失敗剖析。 不過,即使 [decimal] 範圍,符號位仍然受到上述的尊重:

  • 如果二進位字串長度為8位的一些倍數,則會將最高位視為符號位。
  • 如果十六進位字串的長度是8的倍數,且第一個數位為8或更高,則會將數位視為負數。

在二進位和十六進位常值上指定不帶正負號的後綴會忽略符號位。 例如,0xFFFFFFFF 會傳回 -1,但 0xFFFFFFFFu 會傳回 4294967295 的 [uint]::MaxValue。

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