概要
ここでは、整数、小数、論理値などの値型について説明します。
数値と算術演算
数値リテラル
とりあえず、 整数は System.Int32 実数は System.Double になるっぽいです。
> (1).GetType().FullName System.Int32 > (1.1).GetType().FullName System.Double
整数は、通常はもちろん10進数で書きますが、 0x を頭に付けると16進数になります。
> 0xff
255
整数値なんだけど double で保持したい場合、 末尾に小数点を打って、 1. とすれば OK。 小数点の後ろの 0 は省略可能。
> (1.).GetType().FullName
System.Double
double は科学表記も可能です。 (例えば、1.234e6 で 1.234 × 10 6 の意味になる。)
> 1.234e6
1234000
それから、1l とか 1L(語尾に l, L)で long になります。
> (1L).GetType().FullName
System.Int64
あと、 キロバイト( 2 10 = 1024)、 メガバイト( 2 20 = 1048576)、 ギガバイト( 2 30 = 1073741824) を表す 1kb, 1mb, 1gb という特殊な定数もあります。
> 1kb 1024 > 1mb 1048576 > 1gb 1073741824
加減乗除
- - * / % で、それぞれ加算、減算、乗算、除算、剰余演算になります。 また、 ++ -- でインクリメント、デクリメントもできます。 この辺りは C 言語や C# と同じです。 ++ と -- に後置きと前置きがある辺りも同じです。
> 5 + 2 7 > 5 - 2 3 > 5 * 2 10 > 5 / 2 2.5 > 5 % 2 1
> $a = 1 > $b = ++$a > $a,$b 2 2 > $a = 1 > $b = $a++ > $a,$b 2 1
ここで、割り算結果の型に関してですが、 整数÷整数は、割り切れるときは int のまま、 割り切れないときは勝手に double になるようです。 まあ、流石に 2.5 * 2 が整数にはなったりはしません。
> (5 / 2).GetType().Name Double > (4 / 2).GetType().Name Int32 > (5 / 2 * 2).GetType().Name Double
あと、int の演算の結果が int で表現できる範囲を超えた場合、 勝手に double に変換されるようです。 (long なら表現できる桁であっても、double になる。)
> 1gb * 1gb 1.15292150460685E+18 > [long]1gb * 1gb 1152921504606846976 > (1gb * 1gb).GetType().Name Double > ([long]1gb * 1gb).GetType().Name Int64
ちなみに、 double → int への変換時には、四捨五入されます。 (挙動は System.Math.Round() メソッドと同じで、 いわゆる偶数丸め(round to even)。)
> [int]1.49 1 > [int]1.5 2 > [int]2.49 2 > [int]2.5 2 > [int]2.51 3
比較
比較演算子は -eq -ne -lt -gt -le -ge となっています。 まあ、一応説明すると、前から順に、 equal, not equal, less than, greater than, less or equal, greater or equal です。 C 系統の言語でいうところの、 ==, !=, <, >, <=, >= なんですが、 PowerShell では < とかが他に特別な意味を持つので、 このような形になっています。
> $a = 1 > if($a -eq 1) {echo '$a equals 1'} $a equals 1
ビットごとの論理演算
ビットごとの論理演算もできて、 -bnot -band -bor -bxor がそれぞれ、 ビット反転、ビットごとの AND、ビットごとの OR、ビットごとの XOR です。
> 1 -bor 2 -bor 3 -bor 4 7 > 0x1234 -band 0xff 52 > 0x0034 52
-and や -or 演算子(論理値の演算子)との違いに注意してください。 ( 整数から論理値への自動型変換があるので 1 -and 2 とかの式もかけますが、 結果は $true -and $true、つまり $true になります。 )
論理値
整数が System.Int32、小数が System.Double になるのと同様に、 -eq 演算などの結果は System.Boolean になります(bool という名前でも参照可能)。
で、論理値の真と偽を表すための特殊な変数 $true, $false があります。
あと、PowerShell では、数値や文字列から論理値への自動型変換があります。 変換ルールは以下の通り。
-
数値: 非 0 なら真
-
文字列: "False" という文字列は偽扱い。"False" を除いて、長さ>0 の文字列は真。
-
配列: 長さが 2 以上なら真。長さ1の場合は中身によって真偽を判断。長さ 0 の配列は偽。
-
任意のオブジェクト参照: null 値なら偽。
論理演算
論理値用の演算子として、 ! -not -and -or の4つがあります。 このうち、! と -not は同じ意味です。 -not -and -or は、まあ、名前どおり、論理否定、論理 AND、論理 OR です。
> $true -and $true True > $true -and $false False > $false -and $false False > $true -or $true True > $true -or $false True > $false -or $false False > -not $true False > -not $false True
PowerShell では、他の型から bool への自動型変換があるので、 整数のビットごとの AND (-band)などのつもりで -and と書いてしまわないように注意してください。