オーバーフローについて

解決


初心者  2006-06-30 03:14:32  No: 132101

次の計算をするとオーバーフローしてしまいます。

dim  a as long
a = 62 + (7 + 1) * (64 * 123)

なぜでしょうか?
解決策はありますか?
あれば、解決方法を教えてください。よろしくお願いします。


魔界の仮面弁士  2006-06-30 05:36:32  No: 132102

計算結果を収める a だけが Long になっていても、意味はありません。
変数収める前の計算時に、既に桁あふれが発生しているからです。

a = 62 + (7 + 1) * (64 * 123) というコードは、
a = 62 + 8 * 7872 ということになりますよね。

ここまでは良いのですが、問題はこの後にあります。具体的には、
8 × 7872 = 62976 という計算がオーバーフローになっています。
(Integer の最大値は、32767 です)

そもそも、62, 7, 1, 64, 123 はそれぞれ、Integer 型の値です。
(これは、『Debug.Print TypeName(123)』などを実行すると確認できます)

加えて、ヘルプで「* 演算子」について調べてみると、
Integer 型 × Integer 型が、Integer 型として扱われる事がわかります。

ですから、たとえば
  a = 62 + (7 + 1) * CLng(64 * 123)
のように、計算途中で Long 型への変換を加えるか、もしくは、
123 ではなく、123& という「Long型の123」という表現を使えば OK です。


初心者  2006-06-30 05:41:00  No: 132103

過去のログに同じような質問がありました。
a = 62 + (7 + 1) * CLng(64 * 123)
のようにしたらオーバーフローしなくなりました。


初心者  2006-06-30 05:44:22  No: 132104

詳しい説明ありがとうございます。
計算上問題なさそうなのにどぉしてだろうと
悩んでました。
内部でInteger型として計算されちゃうんですね・・・


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

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






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