PowerShell version 1 では符号なし64ビット変数 uint64 間の演算を行おうとすると実行時にエラーになります。
ただし実際に大きな数値が演算子の両側にあるときのみです。
Uint64型の変数が演算対象であっても、格納されている値が 2147483647(16進数で7FFFFFFF)を超えていなければエラーは発生しません 。
The operation '[System.UInt64] – [System.UInt64]' is not defined.
演算 '[System.UInt64] – [System.UInt64]' は定義されていません。
version 2 CTP3 ではそのような制限はなく演算可能となっています。たとえば次のような計算を行ってもエラーは発生しません。
PS > [uint64]$v1 = 2147483648
PS > [uint64]$v2 = 2147483647
PS > $v1 – $v2
Version 1 での対処方法は
- 1bit 精度を失っても問題のない場合には、それぞれ2で割って引いて2倍する。
- そもそも元の値がInt64の範囲を超えない保証があるならキャストして引き算する。
- Decimal構造体を使う。たとえば $GDiff = [Decimal]$G2 – [Decimal]$G1 のように。
などが考えられます。
演算速度や変数サイズなどを気にしないなら Decimal 構造体を使うのがよさそうです。
演算速度や変数サイズなどを気にしないなら Decimal 構造体を使うのがよさそうです。
Version 2 ではそのような考慮は不要になっています。
PowerShell のようなタイプのスクリプト言語は、
意識的に uint64 型の変数を使用している時以外にも、
何かシステムから取得した値が uint64 になっているという場合があるので注意が必要です。
簡単なテストでは実行時に小さな数値しか取得されず、
エラー発生の可能性に気づかないことがあるかもしれません。
コメント