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 では、次の型アクセラレータがサポートされています。

Accelerator 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 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]解析します。

整数数値リテラルの解析

整数型リテラルは、次の手順を使用して解析されます。

  1. 基数の形式を決定する
    • バイナリ形式の場合は、次に解析します [BigInteger]
    • 16 進形式の場合は、特殊な casies を使用して解析[BigInteger]し、値が範囲内にある[long]場合に元の動作を[int]保持します。
    • バイナリでも 16 進数でもない場合は、通常 [BigInteger]は .
  2. キャストを試みる前に乗数の値を適用して、オーバーフローなしで型の境界を適切にチェックできるようにします。
  3. 型サフィックスを確認します。
    • 型の境界を確認し、その型の解析を試みます。
    • サフィックスが使用されていない場合、値は次の順序で境界チェックされ、結果として最初の成功したテストで数値の型が決定されます。
      • [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]