about_Numeric_Literals
簡単な説明
この記事では、PowerShell での数値の構文と使用方法について説明します。
詳細な説明
数値リテラルには、整数と実数の 2 種類があります。 どちらも型サフィックスと乗数サフィックスを持つことができます。
整数リテラル
整数リテラルは、10 進数、16 進数、またはバイナリ表記で記述できます。
16 進数リテラルの前には 0x
が付き、2 進リテラルには 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 |
kibibyte (10241) 乗数 | |
mb |
mebibyte (10242) 乗数 | |
gb |
gigibyte (10243) 乗数 | |
tb |
teribyte (10244) 乗数 | |
pb |
ペチバイト (10245) 乗数 |
整数リテラルの型は、その値、型サフィックス、および数値乗数サフィックスによって決まります。
型サフィックスのない整数リテラルの場合:
- 値を
[int]
型で表すことができる場合、その型です。 - それ以外の場合、
[long]
型で値を表すことができる場合は、その型になります。 - それ以外の場合、
[decimal]
型で値を表すことができる場合は、その型になります。 - それ以外の場合は、
[double]
型で表されます。
型サフィックスを持つ整数リテラルの場合:
- 型サフィックスが
u
で、値を型[uint]
表すことができる場合、その型は[uint]
。 - 型サフィックスが
u
で、値を型[ulong]
表すことができる場合、その型は[ulong]
。 - その値を指定された型で表すことができる場合は、その型です。
- それ以外の場合、そのリテラルの形式が正しくありません。
実数リテラル
実際のリテラルは、10 進表記でのみ書き込むことができます。 この表記には、小数点に続く小数部と指数部を使用した指数表記を含めることができます。
指数部には、'e' の後に省略可能な符号 (+/-) と指数を表す数値が含まれます。 たとえば、リテラル値 1e2
数値 100 と等しくなります。
実際のリテラルには、型サフィックスと乗数サフィックスを指定できます。
敬称 | 意味 |
---|---|
d |
Decimal データ型 |
kb |
kibibyte (10241) 乗数 |
mb |
mebibyte (10242) 乗数 |
gb |
gigibyte (10243) 乗数 |
tb |
teribyte (10244) 乗数 |
pb |
ペチバイト (10245) 乗数 |
実数リテラルには、double と decimal の 2 種類があります。 これらは、それぞれ 10 進型サフィックスの存在または存在によって示されます。 PowerShell では、 [float]
値のリテラル表現はサポートされていません。 double 実数リテラルには型 [double]
があります。 10 進実リテラルの型は [decimal]
。
decimal 実数リテラルの小数部の末尾の 0 は有意です。
[double]
実数リテラル内の指数部の数字の値が、サポートされている最小値より小さい場合、その[double]
実数リテラルの値は 0 になります。 [decimal]
実数リテラル内の指数部の数字の値が、サポートされている最小値より小さい場合、そのリテラルの形式が正しくありません。 [double]
または実数リテラルの指数部の数字の値[decimal]
サポートされている最大値より大きい場合、そのリテラルの形式が正しくありません。
Note
この構文では、double 実数リテラルに長い型のサフィックスを付けることができます。
PowerShell では、このケースは、 [long]
型で表される値を持つ整数リテラルとして扱います。 この機能は、以前のバージョンの PowerShell との下位互換性のために残されています。 ただし、プログラマはこの形式の整数リテラルを使用しないことをお勧めします。これは、リテラルの実際の値を簡単に隠すことができるためです。 たとえば、値が 1 の 1.2L
、 1.2345e1L
に値 12、 1.2345e-5L
に値 0 があり、いずれもすぐには明らかではありません。
数値乗数
便宜上、整数リテラルと実数リテラルには数値乗数を含めることができます。これは、一般的に使用される 2 のべき乗のセットの 1 つを示します。 数値乗数は、大文字と小文字の任意の組み合わせで記述できます。
乗数サフィックスは、任意の型サフィックスと組み合わせて使用できますが、型サフィックスの後に存在する必要があります。 たとえば、リテラル 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 では、次の型アクセラレータがサポートされています。
アクセラレータ | Note | 説明 |
---|---|---|
[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 ビット浮動小数点 |
Note
PowerShell 6.2 では、 [short]
、 [ushort]
、 [uint]
、 [ulong]
の型アクセラレータが追加されました。
例
次の表に、数値リテラルの例をいくつか示し、その型と値を示します。
番号 | Type | 値 |
---|---|---|
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 進数の操作
大きすぎるバイナリリテラルまたは 16 進数リテラルは、n
サフィックスが指定されている場合にのみ、解析に失敗するのではなく、[bigint]
として返すことができます。 ただし、符号ビットは、 [decimal]
範囲であっても上記に引き続き考慮されます。
- バイナリ文字列が 8 ビットの倍数である場合、最上位ビットは符号ビットとして扱われます。
- 長さが 8 の倍数である 16 進文字列の最初の桁が 8 以上の場合、数字は負の数として扱われます。
バイナリ リテラルと 16 進リテラルに符号なしサフィックスを指定すると、符号ビットは無視されます。 たとえば、 0xFFFFFFFF
は -1
を返しますが、 0xFFFFFFFFu
は4294967295の [uint]::MaxValue
を返します。
PowerShell 7.1 では、16 進リテラルで型サフィックスを使用すると、その型の符号付き値が返されるようになりました。 たとえば、PowerShell 7.0 では、正の値が[int16]
型に対して大きすぎるため、式0xFFFFs
はエラーを返します。
PowerShell 7.1 では、これは[int16]
の種類である-1
として解釈されます。
リテラルの前に 0
を付けると、これをバイパスし、符号なしとして扱われます。
(例: 0b011111111
)。 これは、u
とn
サフィックスを組み合わせることができないので、[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 進数形式の場合は、特殊なケースを使用して
[BigInteger]
に解析し、値が[int]
または[long]
範囲内にある場合に元の動作を保持します。 - バイナリでも 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
また、 [ulong]::MaxValue
と [decimal]::MaxValue
の間の値は、精度を維持するために 10 進サフィックス D
を使用して示す必要があります。 サフィックスがない場合、これらの値は実解析モードを使用して [Double]
として解析されます。
PowerShell