概要
ここでは、整数、小数、論理値などの値型について説明します。
数値と算術演算
数値リテラル
とりあえず、 整数は System.Int32 実数は System.Double になるっぽいです。
> (1).GetType().FullName
System.Int32
> (1.1).GetType().FullName
System.Double
整数は、通常はもちろん10進数で書きますが、 0x を頭に付けると16進数になります。
> 0xff
255
整数値なんだけど double で保持したい場合、 末尾に小数点を打って、
- とすれば 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 と書いてしまわないように注意してください。
