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 kibibyte (10241) 乗数
mb メビバイト (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 メビバイト (10242) 乗数
gb gigibyte (10243) 乗数
tb teribyte (10244) 乗数
pb ペチバイト (10245) 乗数

実際のリテラルには、double と decimal の 2 種類があります。 これらは、それぞれ 10 進型サフィックスの存在または存在によって示されます。 PowerShell では、[float] 値のリテラル表現はサポートされていません。 double 実数リテラルの型は [double]です。 10 進数の実数リテラルには、[decimal]型があります。 10 進実リテラルの分数部分の末尾のゼロは有効です。

[double] 実数リテラル内の指数部の数字の値が、サポートされている最小値より小さい場合、その [double] 実リテラルの値は 0 になります。 [decimal] 実数リテラル内の指数部の数字の値が、サポートされている最小値より小さい場合、そのリテラルの形式が正しくありません。 [double] または [decimal] 実数リテラル内の指数部の数字の値がサポートされている最大値より大きい場合、そのリテラルの形式が正しくありません。

手記

この構文では、double 実数リテラルに長い型のサフィックスを付けることができます。 PowerShell では、このケースは、[long]型で表される値を持つ整数リテラルとして扱います。 この機能は、以前のバージョンの PowerShell との下位互換性のために保持されています。 ただし、プログラマはリテラルの実際の値を簡単に隠すことができるため、この形式の整数リテラルを使用しないことをお勧めします。 たとえば、値が 1 の 1.2L、1.2345e1L に値 12、1.2345e-5L 値 0 があり、いずれもすぐには明らかではありません。

数値乗数

便宜上、整数リテラルと実数リテラルには数値乗数を含めることができます。これは、一般的に使用される 2 のべき乗のセットの 1 つを示します。 数値乗数は、大文字と小文字の任意の組み合わせで記述できます。

乗数サフィックスは、任意の型サフィックスと組み合わせて使用できますが、型サフィックスの後に存在する必要があります。 たとえば、リテラル 100gbL の形式は正しくありませんが、リテラル 100Lgb は有効です。

乗数によって、サフィックスで指定された数値型の可能な値を超える値が作成された場合、リテラルの形式が正しくありません。 たとえば、リテラル 1usgb の形式が正しくありません。これは、1gb 値が、[ushort] サフィックスで指定された us 型で許可される値よりも大きいためです。

乗数の例

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 ビット整数
[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 小数 100
100l Int64 100
100uL UInt64 100
100us UInt16 100
100uy バイト 100
100y SByte 100
1e2 複 100
1.e2 複 100
0x1e2 Int32 482
0x1e2L Int64 482
0x1e2D Int32 7725
482D 小数 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 進数リテラルは、[bigint] サフィックスが指定されている場合にのみ、解析を失敗するのではなく、n として返すことができます。 ただし、符号ビットは、[decimal] 範囲であっても上記に引き続き考慮されます。

  • バイナリ文字列が 8 ビットの倍数である場合、最上位ビットは符号ビットとして扱われます。
  • 長さが 8 の倍数である 16 進文字列の最初の桁が 8 以上の場合、数字は負の数として扱われます。

バイナリ リテラルと 16 進リテラルに符号なしサフィックスを指定すると、符号ビットは無視されます。 たとえば、0xFFFFFFFF は -1を返しますが、0xFFFFFFFFu は4294967295の [uint]::MaxValue を返します。

PowerShell 7.1 では、16 進リテラルで型サフィックスを使用すると、その型の符号付き値が返されるようになりました。 たとえば、PowerShell 7.0 では、正の値が 0xFFFFs 型に対して大きすぎるため、式 [int16] はエラーを返します。 PowerShell 7.1 では、これは -1 の種類である [int16] として解釈されます。

リテラルの前に 0 を付けると、これをバイパスし、符号なしとして扱われます。 例: 0b011111111. これは、[bigint] と u サフィックスを組み合わせることができないので、n 範囲内のリテラルを操作する場合に必要な場合があります。

- プレフィックスを使用して、バイナリ リテラルと 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 つの例は、数値リテラルの終了位置を PowerShell パーサーが判断でき、GetType メソッドが開始されるため、リテラル値をかっこで囲まずに動作します。

PowerShell で数値リテラルを解析する方法

PowerShell v7.0 では、新しい機能を有効にするために数値リテラルの解析方法が変更されました。

実際の数値リテラルの解析

リテラルに小数点または e 表記が含まれている場合、リテラル文字列は実数として解析されます。

  • 10 進サフィックスが存在する場合は、[decimal]に直接入力します。
  • それ以外の場合は、[double] として解析し、乗数を値に適用します。 次に、型サフィックスを確認し、適切な型にキャストしようとします。
  • 文字列に型サフィックスがない場合は、[double]として解析します。

整数数値リテラルの解析

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

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

また、[ulong]::MaxValue と [decimal]::MaxValue の間の値は、精度を維持するために 10 進サフィックス D を使用して示す必要があります。 サフィックスがない場合、これらの値は実解析モードを使用して [double] として解析されます。