• ベストアンサー

なぜオーバーフローになるのでしょうか。

VB6です。 こんな現象初めてでびっくりしました。 変数A、h、mはLong型です。 A = 9 * 3600 + 54 * 60 ->オーバーフロー発生 A = 35640 ->オーバーフローにならない h = 9 : m = 54 A = h * 3600 + m * 60 ->オーバーフローにならない 変数ではなく、実数で計算するとオーバーフローする意味がわかりません。また、計算結果を直接実数で代入した場合、なぜオーバーフローは 発生しないのかも意味不明です・・・ なぜ、オーバーフローが発生したりしなかったりするのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.1

何の指定もなく実数(整数)で計算を行うとInteger型で 計算されるからです。 A = CLng(9) * CLng(3600) + CLng(54) * CLng(60) または A = CLng(9 * 3600) + CLng(54 * 60) として下さい。

xiaolong_goo
質問者

お礼

ほへ!? あんぐりです・・・ 実数にも型が・・・初めて知りました。 ありがとうございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 A = 9 * 3600 + 54 * 60 Integer型の範囲が越えてしまうからです。 A = 9 * 3600 + 54 * 60& と一つ、リテラル値を、Long型にすれば通ります。

xiaolong_goo
質問者

お礼

ありがとうございました。 10年以上プログラミングはしているのに、独学とは恐ろしいものだと 実感しました。 実数の型なんて私の頭の辞書には載ってませんでした・・・ そういや、すべて実数で式をコーディングするのなんていままで無かったです・・・ 式の中に、longで宣言された変数があったので気がつかなかったってことなのでしょうね。 トホホ・・・・ です・・・

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

捕捉 最初からInteger型の範囲を超えていた場合には、Long型と して計算を行いますが、それぞれの値がIntegerの範囲内で あればInteger型として計算されます。

関連するQ&A

  • VBAで一時的にオーバーフローを回避したい

    こんにちは とあるハッシュ値のようなものを作成するプロセスで困っています。 次のようなコードを書いています。 Dim MAXLONG As Long MAXLONG = &H7FFFFFFF 'Long型の正の数の上限です。 result = num1 * num2 If ( result > MAXLONG) Then '数値を減らす処理 計算結果が Long 型の最大値を超えている場合に上限に収まるよう調整する処理をしたいのですが、最大値を超えている時点で result 変数に格納できずにエラーになってしまいます。 変数を事前にすべて As Long で宣言し、数値ではなく &H付きの 16 進数で代入してみたり、Clng() で囲ってみたり・・・いろいろ試したのですができません。 最終的には Long 型の範囲内に収めてその数値を使いたいのですが、一時的に溢れたかどうかをどのように判定すればよいのでしょうか? 補足すべき事があれば教えてください。 Windows 7 Pro 64bit Excel 2007 (これは32bit)

  • オーバーフロー時の液面上昇について

    PVC t10 の 500×500×500H(全て内寸)の普通のタンクがあります。 その側面の1面に、槽上端から50mm~100mmの開口 (高さ:50mm、幅:500mmの開口)があります。 今、そのタンクに80L/minで水を入れて行ったときに、 やがて50×500の開口部からオーバーフローしますが、 そのときのオーバーフローしている水の、開口部での高さ (400mmHよりも、10mmとかそれくらいは上がると思うのですが・・・) を計算して教えていただければと思います。 また、そのあとに、開口部の水が出て行くところの板を斜め45度に 削り取り、400mmHのところが頂点になるような構造になった時、 (水が流れやすくなると思うのですが・・・)、液面上昇寸法が 削らなかった時と異なるならば、その時の値も教えていただければ と思います。 お手数おかけしますが、よろしくお願い致します。 ちなみに合っているかどうかわかりませんが、自分で計算した 結果は以下の通りです。 80L/min=0.03m3/min=0.0005m3/sec  Q=Av 、および v=√(2gh) より 0.0005(m3/sec) = 0.05×h(m2) × √(2×9.8(m/sec2)×h(m)) 両辺を2乗してまとめると 0.049h3 = 0.00000025 ∴ h = 0.0172(m) よって、オーバーフロー部から流出するときの抵抗が無い時 (斜め45度に削られているような時)の液面上昇高さは「約17mm」 上記のような計算であっていますでしょうか? 間違っていましたら、訂正お願いします。 また、10mm板厚がある場合などは、抵抗があってさらに液面上昇 するでしょうか? するとしたら、何mm上昇するでしょうか? 大変お手数ですが、計算式で提示いただけますと助かります。

  • フォームのテキストコントロールに代入された計算式を計算したい

    VB.Netのイベントで、フォームのテキストコントロールに代入された計算式を計算したいのです。 (String変数に代入された値でも構いません) 計算式.textに "3*4+5"等の計算式が代入されているとします。 これを計算して結果を変数に代入させたいのですが、Textになっているので、どうすればよいか分かりません。 よい方法を教えて下さい。

  • 参照なバリアント

    VB熟達者というよりは、VBマニアな方々に質問です。 Sub Hoge(A) A = 6 End Sub Sub Main() Dim N As Long Hoge N Debug.Print N End Sub このコードを実行して "6" が出力されるのは明白です。 Hogeはバリアントの参照を取るにも関わらず、LongのNを渡してそのNに6を入れてくれました。 これは、VBが引数を渡す時点で変数A用のメモリ領域をかってに確保し、Nという変数の参照型を作ったということの証拠になります。 実際、DLLでAPIを用意して、バリアント構造体のVarTypeを調べたところ、未知の16387という数値が現れました。 これは、MSDNライブラリを見たところ、VT_LONG Or VT_BYREFのようです。 このように、VBでも参照型は存在していますが、隠蔽されています。 そこで、参照型をもっと自由に使いたいと思い、参照型を作るAPIを作ってみました。 しかし、=演算子で代入しようとしたところ、参照が解除されて通常のバリアント型に戻ってしまいます。 ただし、もともとある変数の参照であるバリアント変数を別の変数の参照に変えたもののときは、参照先に代入してくれました。 どうやらVBはケチなようで、VBが内部で引数として作った参照変数以外は、参照している先に代入はしてくれないようです。 この障害を乗り越える方法を思いついた方、ぜひ教えてください。

  • C言語の質問です。

    1.(a*b)/(a+b)の計算をさせたいのです。ふつうに変数は代入される方法でいいです。 #include <stdio.h> main() { double a,b S=(a*b)/(a+b) printf ("%f\n",S) } 上記のプログラムでできますか?間違いならば修正・訂正をお願いします。 2.整数の変数aに2.147.483.647をいれ、1を加えるとどうなるか? 実数の変数dに、 d=1/2とするとどうなるか? d=1.0/2とするとどうなるか? 実数の変数d1,d2,d3に対して、 d3=d1-d2を計算するとどうなるか? 出力は、「%22.16g-%22.16g=%22.16g」の書式で、d1,d2,d3を出力しましょう。 d1 | d2 0.1 | 0.01 1.0 | 1.0000000000000 (0は14個) 1.0 | 0.00000000000000001 (0は16個) 上記のようなプログラムでOKです。教えて下さい。

  • WIN95のソフトウェアがインストールエラー 【実行時エラー'6';オーバーフロー】

    古いソフトWIN95をインストールしようとしたら【実行時エラー'6';オーバーフロー】と表示されます。意味不明の表示なのでGoogleで検索したら有効そうなものがHPがありました。 http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200202_02020013.html 拝読したのですがPC初心者の私ではなんのことがさっぱり解りません。 どなたか原因が解る方ご教授お願いします。

  • このマクロについて…(オーバーフローといわれる)

    なんとなくの流れですが、D列からH列まで入力箇所があって、Iに合計が出るようになっています。 D列は10000円、E列は5000円、F列は1000円、G列は500円、H列は100円というような金種表のようなものです。 Iは上記の金額に入力した数値をかけて、その合計を出すように数式が入っています。 そしてボタンを押すと、この数値をそれぞれの変数に代入するようになっています。 【例】 I6→hensuu1 I7→hensuu2 このI列の合計値が32800以下だった場合、通常とおりに動くのですが、32800以上だった場合、「オーバーフローしました」と エラーが出てしまいます。 これは一体なぜでしょうか? コードの一部ですが載せておきます。 If Range("I6") = "" Then hensuu1 = 0 Else hensuu1 = Range("I6") End If If Range("I7") = "" Then hensuu2 = 0 Else hensuu2 = Range("I7") End If

  • VB2008で小数点以下3桁を表示しない方法は?

    VB歴1週間となりました。 初めてのVBですがVB2008EEの完成度高さに驚いております。 とても扱いやすかったです。 RS232C通信で外部機器から実数をもらい、計算加工などを行いハイパーテキストに表示するというものです。 大まか完成したのですが、実数の表示がちょっと見にくくなっています。 例) 3333.3333334564 と表示される 3333.3345 とか小数点以下4桁みたいに設定できるでしょうか? 計算させて丸めれば済む話なのですが、3333.3300 みたいにしたいのです。 意味不明な質問かもしれませんがご理解の程宜しくお願いします。

  • DECIMALを使った計算式のオーバーフロー

    (A * 100 /((B / C) * D) -0.05) という式を作っています。 型は以下の通りになります。 A の型:DECIMAL(18,7) B の型:DECIMAL(15,0) C の型:DECIMAL(5,0) D の型:DECIMAL(3,0) 結果を小数点第1まで表示したいけど、このままだとB がDECIMAL(15,0)の為小数点以下が出ないので、 とりあえずBをAと同じ型CAST(B as decimal(18,7))とうい風にキャストして小数点以下を出しています。 (A * 100 /((CAST(B as decimal(18,7))/ p_kadou_m) * p_kadou_to) -0.05) 今はうまく動作しているのですが、オーバーフローが出ないか心配しています。 オーバーフローを発生させないようにするにはどこを配慮したら良いのでしょうか。 CASTしているBの桁は今、桁は(18,7)にしているのですが、何が最適になるのでしょうか。

  • C# uint += long

    C# uint += long こんにちは、 C#なのですが、 uint a=0xffff0000; long b=-100; である場合、 a+=b; とするとエラーになります。 オーバーフローは考えないとして、この計算を行うにはどうすればよいのでしょうか? ifで切り分けるか、64bitで計算するしかないのでしょうか?

専門家に質問してみよう