この処理でオーバフローが起きる理由は?

解決


こじ  2005-08-18 14:42:51  No: 91565  IP: [192.*.*.*]

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」で宣言するとオーバフローは発生しません。

どなたかご教授お願いいたします。

編集 削除
papa  2005-08-18 15:07:09  No: 91566  IP: [192.*.*.*]

Dim i          As Integer
    Dim ltemp As Long

    For i = 1 To 1000
        ltemp = 300 * i
    Next

これも、32767を超えるとエラー

integer * integer をしてるから

編集 削除
ガッ  2005-08-18 15:11:29  No: 91567  IP: [192.*.*.*]

もっと式の型に気をつけましょうということですなぁ…

・Integerのリテラル:300
  →VB6では、整数のリテラルが32767以下なら暗黙的にIntegerになります。
・Integerの変数:i
・(Integer)*(Integer)の演算結果:Integer

よって、i=110のときi*300=33000>32767となり、
Integerの範囲を超えるのでオーバーフローが発生します。

こういうときは
・乗算演算子"*"は大きい型に変換してから演算する
という性質をつかって (Integer)*(Long) という式にしたりしてごまかします。
例えば、Longのリテラル:300&を使って、"300&*i"としてみると…

ι(´Д`υ)アツィー

編集 削除
こじ  2005-08-18 15:18:16  No: 91568  IP: [192.*.*.*]

ふむ・・
tmp = Buf(300& * i)
、、
、、、でけた!!Long*Intですね、なるほど。
どうもありがとうございます。

編集 削除