2009年3月29日日曜日

.NET Integer型の乗算でオーバーフローが発生する

Integer型の乗算でオーバーフローが発生する場合があります。
以下のコードでは変数i1とi2の乗算を行っています。
計算の結果がInteger型の範囲に収まらないのは分かっているので、
結果を収める変数をLong型にしましたがオーバーフローが発生します。

オーバーフローを起こさないためには計算に使用する最初の変数i1をLong型にキャストします。

Dim i1 As Integer = 12345678
Dim i2 As Integer = 123456

Dim lResult As Long 

'オーバーフローが起きる
lResult = i1 * i2

'オーバーフローが起きる
lResult = Clng(i1 * i2)

'オーバーフローは起きない
lResult = Clng(i1) * i2


VisualBasicはコンパイル時に、最初の計算に使用する値の型から結果をInteger型と仮定します。
変数i1と変数i2の乗算の結果をIntgerと仮定し、式の結果がIntgerの範囲に収まらないためオーバーフローします。
コンパイル時に結果をLong型と仮定するためには、式の最初の変数i1をLong型にキャストします。

常識らしいです・・・知らなかった・・・(;・∀・)

0 件のコメント: