ja-JP/about_Numeric_Literals.help.txt
|
TOPIC about_Numeric_Literals 簡単な説明 PowerShell における数値の構文と使い方について説明します。 詳細な説明 数値リテラルには、整数リテラルと実数リテラルの 2 種類があります。どちら にも型サフィックスと乗数サフィックスを付けることができます。 整数リテラル 整数リテラルは、10 進数、16 進数、または 2 進数で記述できます。16 進数 リテラルには接頭辞 0x を、2 進数リテラルには接頭辞 0b を付けて、10 進数 と区別します。 整数リテラルには、型サフィックスと乗数サフィックスを付けられます。 サフィックス 意味 備考 ------------ ------------------------------ -------------------- y 符号付きバイト型 PowerShell 6.2 で追加 uy 符号なしバイト型 PowerShell 6.2 で追加 s short 型 PowerShell 6.2 で追加 us 符号なし short 型 PowerShell 6.2 で追加 l long 型 u 符号なし int または long 型 PowerShell 6.2 で追加 ul 符号なし long 型 PowerShell 6.2 で追加 n BigInteger 型 PowerShell 7.0 で追加 kb キビバイト (1024^1) 乗数 mb メビバイト (1024^2) 乗数 gb ギビバイト (1024^3) 乗数 tb テビバイト (1024^4) 乗数 pb ペビバイト (1024^5) 乗数 整数リテラルの型は、その値、型サフィックス、乗数サフィックスによって決ま ります。 型サフィックスのない整数リテラルの場合: - 値が [int] 型で表現できれば、その型になります。 - そうでなく [long] 型で表現できれば、その型になります。 - そうでなく [decimal] 型で表現できれば、その型になります。 - それ以外の場合は [double] 型で表現されます。 型サフィックスのある整数リテラルの場合: - サフィックスが u で、値が [uint] 型で表現できれば [uint] 型になります。 - サフィックスが u で、値が [ulong] 型で表現できれば [ulong] 型になります。 - 値が指定された型で表現できれば、その型になります。 - それ以外の場合、そのリテラルは不正な形式です。 実数リテラル 実数リテラルは 10 進数表記でのみ記述できます。この表記には、小数点に続く 小数部や、指数部を用いた科学技術表記を含められます。 指数部は 'e' に続けて、省略可能な符号 (+/-) と指数を表す数値で構成されま す。たとえば、リテラル値 1e2 は数値 100 と等しくなります。 実数リテラルには、型サフィックスと乗数サフィックスを付けられます。 サフィックス 意味 ------------ ------------------------------ d decimal 型 kb キビバイト (1024^1) 乗数 mb メビバイト (1024^2) 乗数 gb ギビバイト (1024^3) 乗数 tb テビバイト (1024^4) 乗数 pb ペビバイト (1024^5) 乗数 実数リテラルには double と decimal の 2 種類があります。これらは decimal 型サフィックスの有無によって区別されます。PowerShell は [float] 値のリテ ラル表現をサポートしていません。double 実数リテラルは [double] 型に、 decimal 実数リテラルは [decimal] 型になります。decimal 実数リテラルの小数 部の末尾のゼロは有効です。 [double] 実数リテラルの指数部の桁の値がサポートされる最小値より小さい場 合、その [double] 実数リテラルの値は 0 になります。[decimal] 実数リテラル の指数部の桁の値が最小値より小さい場合、そのリテラルは不正な形式です。 [double] または [decimal] 実数リテラルの指数部の桁の値が最大値より大きい 場合、そのリテラルは不正な形式です。 メモ: 構文上は double 実数リテラルに long 型サフィックスを付けられます。 PowerShell はこの場合を、値が [long] 型で表現される整数リテラルとして扱い ます。これは旧バージョンとの互換性のために残されています。ただし、リテラ ルの実際の値が分かりにくくなるため、この形式の使用は推奨されません。たと えば 1.2L の値は 1、1.2345e1L の値は 12、1.2345e-5L の値は 0 であり、いず れも一見して明らかではありません。 数値の乗数 便宜上、整数リテラルと実数リテラルには、よく使われる 2 のべき乗を示す数値 乗数を含められます。数値乗数は大文字と小文字をどのように組み合わせても記 述できます。 乗数サフィックスは任意の型サフィックスと組み合わせて使えますが、型サフィ ックスの後に置く必要があります。たとえば、リテラル 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 は次の型アクセラレーターをサポートしています。 アクセラレーター 備考 説明 ---------------- -------------------- ---------------------------- [byte] バイト (符号なし) [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 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 進数の扱い 過度に大きな 2 進数または 16 進数のリテラルは、n サフィックスが指定されて いる場合に限り、解析に失敗せず [bigint] として返されます。ただし、符号ビ ットは [decimal] の範囲を超えても次のように尊重されます。 - 2 進数文字列の長さが 8 ビットの倍数の場合、最上位ビットは符号ビットとし て扱われます。 - 16 進数文字列の長さが 8 の倍数で、先頭の桁が 8 以上の場合、その数値は負 として扱われます。 2 進数および 16 進数リテラルに符号なしサフィックスを指定すると、符号ビッ トは無視されます。たとえば 0xFFFFFFFF は -1 を返しますが、0xFFFFFFFFu は [uint]::MaxValue である 4294967295 を返します。 PowerShell 7.1 では、16 進数リテラルに型サフィックスを付けると、その型の 符号付きの値を返すようになりました。たとえば PowerShell 7.0 では式 0xFFFFs は、正の値が [int16] 型に対して大きすぎるためエラーになります。 PowerShell 7.1 ではこれを [int16] 型の -1 として解釈します。 リテラルの先頭に 0 を付けると、これを回避して符号なしとして扱われます。た とえば 0b011111111 です。これは [bigint] の範囲の値を扱うときに必要になる ことがあります。u と n のサフィックスは組み合わせられないためです。 また、- 接頭辞を使って 2 進数および 16 進数リテラルを負にすることもできま す。符号ビットが許容されるため、結果が正の数になることがあります。 符号ビットは BigInteger サフィックス付きの数値に対して受け付けられます。 - BigInteger サフィックス付きの 16 進数は、長さが 8 文字の倍数である任意の リテラルの最上位ビットを符号ビットとして扱います。長さには 0x 接頭辞や サフィックスは含まれません。 - BigInteger サフィックス付きの 2 進数は、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 7.0 では、新機能を実現するために数値リテラルの解析方法が変更さ れました。 実数リテラルの解析 リテラルに小数点または e 表記が含まれる場合、そのリテラル文字列は実数とし て解析されます。 - decimal サフィックスがある場合は、直接 [decimal] に解析されます。 - そうでない場合は [double] として解析し、値に乗数を適用します。その後、 型サフィックスを確認し、適切な型へのキャストを試みます。 - 文字列に型サフィックスがない場合は [double] として解析されます。 整数リテラルの解析 整数型のリテラルは次の手順で解析されます。 1. 基数の形式を判別します。 - 2 進数形式の場合は [bigint] に解析します。 - 16 進数形式の場合は、値が [int] または [long] の範囲にあるときに元の 動作を保持する特別な処理を使い、[bigint] に解析します。 - 2 進数でも 16 進数でもない場合は、通常どおり [bigint] として解析しま す。 2. オーバーフローなしで型の範囲を適切に確認できるよう、キャストを試みる前 に乗数の値を適用します。 3. 型サフィックスを確認します。 - 型の範囲を確認し、その型への解析を試みます。 - サフィックスがない場合、値は次の順序で範囲チェックされ、最初に成功し たテストでその数値の型が決まります。 - [int] - [long] - [decimal] (10 進数リテラルのみ) - [double] (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 の間の値は、精度を保つため に decimal サフィックス D を付けて表記する必要があります。サフィックスがな い場合、これらの値は実数解析モードを使って [double] として解析されます。 関連項目 about_Numeric_Literals about_Operators about_Variables ---- 原文: PowerShell-Docs (CC BY 4.0) の翻訳 / PSHelpJaJP |