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

解決


こじ  2005-08-18 23:42:51  No: 91565

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-19 00:07:09  No: 91566

Dim i          As Integer
    Dim ltemp As Long

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

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

integer * integer をしてるから


ガッ  2005-08-19 00:11:29  No: 91567

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

・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-19 00:18:16  No: 91568

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加