about_Numeric_Literals
簡単な説明
この記事では、PowerShell での数値の構文と使用方法について説明します。
詳細な説明
数値リテラルには、整数と実数の 2 種類があります。 どちらも型サフィックスと乗数サフィックスを持つことができます。
整数リテラル
整数リテラルは、10 進数、16 進数、またはバイナリ表記で記述できます。
16 進数リテラルにはプレフィックスが付 0x
き、バイナリ リテラルには 10 進数と区別するためにプレフィックスが付 0b
けられます。
整数リテラルには、型サフィックスと乗数サフィックスを指定できます。
敬称 | 意味 | Note |
---|---|---|
y |
符号付きバイト データ型 | PowerShell 6.2 で追加 |
uy |
unsigned byte データ型 | PowerShell 6.2 で追加 |
s |
short データ型 | PowerShell 6.2 で追加 |
us |
unsigned short データ型 | PowerShell 6.2 で追加 |
l |
long データ型 | |
u |
unsigned int または long データ型 | PowerShell 6.2 で追加 |
ul |
unsigned long データ型 | PowerShell 6.2 で追加 |
n |
BigInteger データ型 | PowerShell 7.0 で追加 |
kb |
キロバイト乗数 | |
mb |
メガバイト乗数 | |
gb |
ギガバイト乗数 | |
tb |
テラバイト乗数 | |
pb |
ペタバイト乗数 |
整数リテラルの型は、その値、型サフィックス、および数値乗数サフィックスによって決まります。
型サフィックスのない整数リテラルの場合:
- 値を型で表すことができる場合は、その型
[int]
です。 - それ以外の場合、値を型で表すことができる場合は、その型
[long]
です。 - それ以外の場合、値を型で表すことができる場合は、その型
[decimal]
です。 - それ以外の場合は、型
[double]
で表されます。
型サフィックスを持つ整数リテラルの場合:
- 型サフィックスが指定
u
され、値を型で表すことができる場合、その型[uint]
は[uint]
. - 型サフィックスが指定
u
され、値を型で表すことができる場合、その型[ulong]
は[ulong]
. - その値を指定された型で表すことができる場合は、その型です。
- それ以外の場合、そのリテラルの形式が正しくありません。
実数リテラル
実際のリテラルは、10 進表記でのみ書き込むことができます。 この表記には、小数点に続く小数部と指数部を使用した指数表記を含めることができます。
指数部には、'e' の後に省略可能な符号 (+/-) と指数を表す数値が含まれます。 たとえば、リテラル値 1e2
は数値 100 と等しくなります。
実際のリテラルには、型サフィックスと乗数サフィックスを指定できます。
敬称 | 意味 |
---|---|
d |
Decimal データ型 |
kb |
キロバイト乗数 |
mb |
メガバイト乗数 |
gb |
ギガバイト乗数 |
tb |
テラバイト乗数 |
pb |
ペタバイト乗数 |
実数リテラルには、double と decimal の 2 種類があります。 これらは、それぞれ 10 進型サフィックスの存在または存在によって示されます。 PowerShell では、値のリテラル表現は [float]
サポートされていません。 double 実数リテラルには型 [double]
があります。 10 進実リテラルには型 [decimal]
があります。
decimal 実数リテラルの小数部の末尾の 0 は有意です。
実数リテラル内の指数部の数字 [double]
の値が、サポートされている最小値より小さい場合、その [double]
実数リテラルの値は 0 になります。 実際のリテラル内 [decimal]
の指数部の数字の値がサポートされている最小値より小さい場合、そのリテラルの形式が正しくありません。 1 つまたは[decimal]
実際のリテラル内[double]
の指数部の数字の値がサポートされている最大値より大きい場合、そのリテラルの形式が正しくありません。
Note
この構文では、double 実数リテラルに長い型のサフィックスを付けることができます。
PowerShell では、このケースは、値が型 [long]
で表される整数リテラルとして扱います。 この機能は、以前のバージョンの PowerShell との下位互換性のために残されています。 ただし、プログラマはこの形式の整数リテラルを使用しないことをお勧めします。これは、リテラルの実際の値を簡単に隠すことができるためです。 たとえば、 1.2L
値が 1 で、 1.2345e1L
値が 12 で、 1.2345e-5L
値が 0 の場合、いずれもすぐには明らかではありません。
数値乗数
便宜上、整数リテラルと実数リテラルには数値乗数を含めることができます。これは、一般的に使用される 2 のべき乗のセットの 1 つを示します。 数値乗数は、大文字と小文字の任意の組み合わせで記述できます。
乗数サフィックスは、任意の型サフィックスと組み合わせて使用できますが、型サフィックスの後に存在する必要があります。 たとえば、リテラル 100gbL
の形式は正しくありませんが、リテラル 100Lgb
は有効です。
乗数によって、サフィックスで指定された数値型の可能な値を超える値が作成された場合、リテラルの形式が正しくありません。 たとえば、値がサフィックスでus
指定された型で許可されている[ushort]
値1gb
よりも大きいため、リテラル1usgb
の形式が正しくありません。
乗数の例
PS> 1kb
1024
PS> 1.30Dmb
1363148.80
PS> 0x10Gb
17179869184
PS> 1.4e23tb
1.5393162788864E+35
PS> 0x12Lpb
20266198323167232
数値型アクセラレータ
PowerShell では、次の型アクセラレータがサポートされています。
Note
PowerShell 6.2 では、次の型アクセラレータが追加されました。 [short]
[ushort]
[uint]
[ulong]
例
次の表に、数値リテラルの例をいくつか示し、その型と値を示します。
番号 | Type | Value |
---|---|---|
100 | Int32 | 100 |
100u | UInt32 | 100 |
100D | 10 進法 | 100 |
100l | Int64 | 100 |
100uL | UInt64 | 100 |
100us | UInt16 | 100 |
100uy | Byte | 100 |
100y | SByte | 100 |
1e2 | 倍精度浮動小数点型 | 100 |
1.e2 | 倍精度浮動小数点型 | 100 |
0x1e2 | Int32 | 482 |
0x1e2L | Int64 | 482 |
0x1e2D | Int32 | 7725 |
482D | 10 進法 | 482 |
482gb | Int64 | 517543559168 |
482ngb | BigInteger | 517543559168 |
0x1e2lgb | Int64 | 517543559168 |
0b1011011 | Int32 | 91 |
0xFFFF | Int16 | -1 |
0xFFFFFFFF | Int32 | -1 |
-0xFFFFFFFF | Int32 | 1 |
0xFFFFFFFFu | UInt32 | 4294967295 |
2 進数または 16 進数の操作
サフィックスが指定されている場合n
にのみ、大きすぎるバイナリリテラルまたは 16 進リテラルは解析に失敗するのではなく、返[bigint]
すことができます。 ただし、符号ビットは偶数の範囲を超えて [decimal]
引き続き考慮されます。
- バイナリ文字列が 8 ビットの倍数である場合、最上位ビットは符号ビットとして扱われます。
- 長さが 8 の倍数である 16 進文字列の最初の桁が 8 以上の場合、数字は負の数として扱われます。
バイナリ リテラルと 16 進リテラルに符号なしサフィックスを指定すると、符号ビットは無視されます。 たとえば、 0xFFFFFFFF
4294967295を -1
返しますが 0xFFFFFFFFu
、返 [uint]::MaxValue
します。
PowerShell 7.1 では、16 進リテラルで型サフィックスを使用すると、その型の符号付き値が返されるようになりました。 たとえば、PowerShell 7.0 では、正の値が型に対して大きすぎるため、式 0xFFFFs
はエラーを [int16]
返します。
PowerShell 7.1 では[int16]
、これが型として-1
解釈されます。
リテラルの前に a 0
を付けると、これをバイパスし、符号なしとして扱われます。
(例: 0b011111111
)。 これは、範囲内のリテラルを操作するときに必要になる場合があります。これは、サフィックスとn
サフィックスをu
組み合わせることができないので[bigint]
です。
プレフィックスを使用してバイナリ リテラルと 16 進リテラルを -
否定することもできます。 符号ビットが許可されているため、正の数になることがあります。
符号ビットは、BigInteger のサフィックス付き数字に使用できます。
- BigInteger サフィックス付き 16 進数は、長さが 8 文字の倍数のリテラルの上位ビットを符号ビットとして扱います。 この長さには、プレフィックスまたはサフィックスは含
0x
まれません。 - BigInteger サフィックス付きバイナリは、96 文字と 128 文字、および 8 文字ごとに符号ビットを受け入れます。
数値型の変換
文字列を数値に変換する場合は、追加の 16 進形式インジケーターがサポートされます。 これらの追加の形式はリテラルとして認識されません。
[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
最初の 2 つの例は、数値リテラルの終了位置と GetType メソッドの開始位置を PowerShell パーサーが判断できるため、リテラル値をかっこで囲まずに動作します。
PowerShell で数値リテラルを解析する方法
PowerShell v7.0 では、新しい機能を有効にするために数値リテラルの解析方法が変更されました。
実際の数値リテラルの解析
リテラルに小数点または e 表記が含まれている場合、リテラル文字列は実数として解析されます。
- 10 進サフィックスが存在する場合は、
[decimal]
- それ以外の場合は、値として
[Double]
解析し、乗数を適用します。 次に、型サフィックスをチェックし、適切な型へのキャストを試みます。 - 文字列に型サフィックスがない場合は、次のように
[Double]
解析します。
整数数値リテラルの解析
整数型リテラルは、次の手順を使用して解析されます。
- 基数の形式を決定する
- バイナリ形式の場合は、次に解析します
[BigInteger]
。 - 16 進形式の場合は、特殊な casies を使用して解析
[BigInteger]
し、値が範囲内にある[long]
場合に元の動作を[int]
保持します。 - バイナリでも 16 進数でもない場合は、通常
[BigInteger]
は .
- バイナリ形式の場合は、次に解析します
- キャストを試みる前に乗数の値を適用して、オーバーフローなしで型の境界を適切にチェックできるようにします。
- 型サフィックスを確認します。
- 型の境界を確認し、その型の解析を試みます。
- サフィックスが使用されていない場合、値は次の順序で境界チェックされ、結果として最初の成功したテストで数値の型が決定されます。
[int]
[long]
[decimal]
(base-10 リテラルのみ)[double]
(base-10 リテラルのみ)
- 値が 16 進数と 2 進数の
[long]
範囲外の場合、解析は失敗します。 - 値が底 10 の数値の
[double]
範囲外の場合、解析は失敗します。 - リテラル
BigInteger
を解析するには、サフィックスを使用してより高い値をn
明示的に記述する必要があります。
大きな値リテラルの解析
以前は、他の型にキャストされる前に、より高い整数値が double として解析されていました。 これにより、より高い範囲の精度が失われます。 次に例を示します。
PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904
この問題を回避するには、値を文字列として書き込んでから変換する必要がありました。
PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111
PowerShell 7.0 では、サフィックスを使用する N
必要があります。
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
また、10 進サフィックスD
を使用して精度をメインする値と[decimal]::MaxValue
、その間[ulong]::MaxValue
の値を示す必要があります。 サフィックスがない場合、これらの値は実際の解析モードを使用して解析されます [Double]
。
PowerShell