オーバーフロー

解決


ガオー  2008-12-24 08:58:20  No: 32977  IP: 192.*.*.*

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

編集 削除
多分  2008-12-24 09:07:59  No: 32978  IP: 192.*.*.*

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

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

編集 削除
Mr.XRAY  URL  2008-12-24 09:31:14  No: 32979  IP: 192.*.*.*

演算は左側から順番に実行されます.
計算していくと,整数として実行され,整数値の範囲を超えるために発生します.
単に数値を書いた場合は,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 09:34:26  No: 32980  IP: 192.*.*.*

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

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

編集 削除
ガオー  2008-12-24 10:52:33  No: 32981  IP: 192.*.*.*

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

編集 削除