uint64 の演算

私のブログに書いていた記事を少し改訂して転載します

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 構造体を使うのがよさそうです。 
 
Version 2 ではそのような考慮は不要になっています。
 
PowerShell のようなタイプのスクリプト言語は、
意識的に uint64 型の変数を使用している時以外にも、
何かシステムから取得した値が uint64 になっているという場合があるので注意が必要です。
簡単なテストでは実行時に小さな数値しか取得されず、
エラー発生の可能性に気づかないことがあるかもしれません。

コメント

タイトルとURLをコピーしました