Dim i As Integer
Dim tmp As Integer
Dim Buf(50000) As Integer
For i = 1 To 1000
tmp = Buf(300 * i)
Next
上記処理で
「i=110(33000=300*i)」の時にオーバフローが発生しました。
「i」が「32767」を超えた時に発生する事は分かります。
ですが、「300*i」が「32767」を超えるとなぜオーバフローになるのでしょうか。
ちなみに「i」を「Long」で宣言するとオーバフローは発生しません。
どなたかご教授お願いいたします。
Dim i As Integer
Dim ltemp As Long
For i = 1 To 1000
ltemp = 300 * i
Next
これも、32767を超えるとエラー
integer * integer をしてるから
もっと式の型に気をつけましょうということですなぁ…
・Integerのリテラル:300
→VB6では、整数のリテラルが32767以下なら暗黙的にIntegerになります。
・Integerの変数:i
・(Integer)*(Integer)の演算結果:Integer
よって、i=110のときi*300=33000>32767となり、
Integerの範囲を超えるのでオーバーフローが発生します。
こういうときは
・乗算演算子"*"は大きい型に変換してから演算する
という性質をつかって (Integer)*(Long) という式にしたりしてごまかします。
例えば、Longのリテラル:300&を使って、"300&*i"としてみると…
ι(´Д`υ)アツィー
ふむ・・
tmp = Buf(300& * i)
、、
、、、でけた!!Long*Intですね、なるほど。
どうもありがとうございます。
ツイート | ![]() |