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