about_Numeric_Literals
簡単な説明
この記事では、PowerShell での数値の構文と使用方法について説明します。
長い説明
数値リテラルには、整数と実数の 2 種類があります。 どちらも型サフィックスと乗数サフィックスを持つことができます。
整数リテラル
整数リテラルは、10 進数、16 進数、またはバイナリ表記で記述できます。
16 進数リテラルには プレフィックスが付 0x
き、バイナリ リテラルには 10 進数と区別するために がプレフィックスとして付 0b
けられます。
整数リテラルには、型サフィックスと乗数サフィックスを指定できます。
サフィックス | 説明 | 注意 |
---|---|---|
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]
は です。 10 進実リテラルの型 [decimal]
は です。
decimal 実数リテラルの小数部の末尾の 0 は有意です。
実数リテラル内の指数部の数字 [double]
の値がサポートされている最小値より小さい場合、その [double]
実リテラルの値は 0 になります。 実際のリテラル内 [decimal]
の指数部の数字の値がサポートされている最小値より小さい場合、そのリテラルの形式は正しくありません。 または[decimal]
実数リテラルの指数部の数字[double]
の値がサポートされている最大値を超える場合、そのリテラルの形式は正しくありません。
注意
この構文では、倍精度リテラルに long 型のサフィックスを指定できます。
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 では、次の型アクセラレータがサポートされています。
アクセラレータ | 注意 | 説明 |
---|---|---|
[byte] |
Byte (unsigned) | |
[sbyte] |
バイト (符号付き) | |
[Int16] |
16 ビット整数 | |
[short] |
[int16] の別名 |
16 ビット整数 |
[UInt16] |
16 ビット整数 (符号なし) | |
[ushort] |
[uint16] の別名 |
16 ビット整数 (符号なし) |
[Int32] |
32-bit integer | |
[int] |
[int32] の別名 |
32-bit integer |
[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 | Byte | 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 |
0xFFFFs | Int16 | -1 |
0xFFFFFFFF | Int32 | -1 |
-0xFFFFFFFF | Int32 | 1 |
0xFFFFFFFFu | UInt32 | 4294967295 |
2 進数または 16 進数の操作
サフィックスが指定されている場合n
にのみ、大きすぎるバイナリリテラルまたは 16 進数リテラルは、解析に失敗するのではなく として[bigint]
を返すことができます。 ただし、符号ビットは偶数の範囲を超えて [decimal]
引き続き考慮されます。
- バイナリ文字列が 8 ビットの倍数である場合、最上位ビットは符号ビットとして扱われます。
- 長さが 8 の倍数の 16 進文字列の最初の数字が 8 以上の場合、数字は負の値として扱われます。
バイナリ リテラルと 16 進リテラルに符号なしサフィックスを指定すると、符号ビットは無視されます。 たとえば、 0xFFFFFFFF
は を -1
返しますが、 0xFFFFFFFFu
4294967295の を [uint]::MaxValue
返します。
PowerShell 7.1 では、16 進リテラルで型サフィックスを使用すると、その型の符号付き値が返されるようになりました。 たとえば、PowerShell 7.0 では、正の値が型に対して大きすぎるため、式 0xFFFFs
はエラーを [int16]
返します。
PowerShell 7.1 では[int16]
、これを 型と-1
解釈します。
リテラルの前に を付 0
けると、これをバイパスし、符号なしとして扱われます。
(例: 0b011111111
)。 これは、 および n
サフィックスを組み合わせることができないので、範囲内の[bigint]
リテラルをu
操作する場合に必要になる場合があります。
プレフィックスを使用してバイナリ リテラルと 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]
範囲外の場合、解析は失敗します。 - リテラルを として解析するには、サフィックスを
n
使用して、より高い値を明示的に記述するBigInteger
必要があります。
大きな値リテラルの解析
以前は、より高い整数値は、他の型にキャストされる前に double として解析されていました。 これにより、より高い範囲の精度が失われます。 例:
PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904
この問題を回避するには、値を文字列として書き込み、変換する必要がありました。
PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111
PowerShell 7.0 では、サフィックスを使用する N
必要があります。
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
また、 と [decimal]::MaxValue
の間[ulong]::MaxValue
の値は、精度を維持するために 10 進サフィックスD
を使用して示す必要があります。 サフィックスがない場合、これらの値は実際の解析モードを使用してとして [Double]
解析されます。