次の計算をするとオーバーフローしてしまいます。
dim a as long
a = 62 + (7 + 1) * (64 * 123)
なぜでしょうか?
解決策はありますか?
あれば、解決方法を教えてください。よろしくお願いします。
計算結果を収める 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 です。
過去のログに同じような質問がありました。
a = 62 + (7 + 1) * CLng(64 * 123)
のようにしたらオーバーフローしなくなりました。
詳しい説明ありがとうございます。
計算上問題なさそうなのにどぉしてだろうと
悩んでました。
内部でInteger型として計算されちゃうんですね・・・
ツイート | ![]() |