オーバーフロー

解決


ガオー  2008-12-24 17:58:20  No: 32977

tmp := 1500 * 400 * 4786 * 47 / 1000000);  
上記のようなコーディングをすると
「数値演算のオーバーフロー」というエラーがでます。
回避方法を教えていただけませんでしょうか?


多分  2008-12-24 18:07:59  No: 32978

Shortint -128 〜 127 符号付き8ビット 
Smallint -32768 〜 32767 符号付き16ビット 
Longint -2147483647 〜 2147483647 符号付き32ビット 

tmp をLongintで宣言するか、floatにすればいけないかな?


Mr.XRAY  URL  2008-12-24 18:31:14  No: 32979

演算は左側から順番に実行されます.
計算していくと,整数として実行され,整数値の範囲を超えるために発生します.
単に数値を書いた場合は,32bitと解釈されます.
明示的に,数値が浮動小数点であることを指示するか.Int64等の変数を定義して,そこに代入すればOKですが.
tmpが浮動小数点ですよね( / の演算をしているから).

もっとも,このままでも他のエラーが発生しますけど (^^

procedure TForm1.Button1Click(Sender: TObject);
var
  tmp : Double;
begin
  tmp := 1500.0 * 400.0 * 4786.0 * 47.0 / 1000000);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    a   : Int64;
    b   : Int64;
    c   : Int64;
    d   : Int64;
    Tmp : Double;
begin
    a := 1500;
    b := 400;
    c := 4786;
    d := 47;
    tmp :=a * b * c * d / 1000000; //)と右の不正な文字を削除しました
end;


Mr.XRAY  URL  2008-12-24 18:34:26  No: 32980

>tmpが浮動小数点ですよね( / の演算をしているから).

整数の除算は div ですから.


ガオー  2008-12-24 19:52:33  No: 32981

Mr.XRAYさん、多分さん早速のご回答ありがとうございます。
ご教授頂きました通りトライしましたところ、解決いたしました。
助かりました。
今後とも宜しくお願い致します。


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

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






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