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