C言語関係掲示板

過去ログ

No.592.オーバーフローの検知

[戻る] [ホームページ]
No.5611

オーバーフロー
投稿者---hisa(2003/03/22 21:46:57)


Cの計算でオーバーフローを判定することができますか?

Cでループの中で値を足していく処理を書いているのですが、
longだと20億あたりでオーバーフローしているようで、算出値が変わってしまいます。

どうしたらよいでしょうか。
CGIなんですが、long long は桁が大きすぎてブラウザに渡せないようでサーバーエラーとなってしまいます。

計算の方法、またはオーバーフローのとり方を教えてください


No.5614

Re:オーバーフロー
投稿者---ともじ(2003/03/24 08:20:54)


おはようございます。

>Cでループの中で値を足していく処理を書いているのですが、
>longだと20億あたりでオーバーフローしているようで、算出値が変わってしまいます。

>CGIなんですが、long long は桁が大きすぎてブラウザに渡せないようで
>サーバーエラーとなってしまいます。

unsigned longを使えばlongの倍の値が扱えます。
また、あなたの環境でlong longが使えるのならば、計算誤差を出さない
ために、加算処理はlong longで行い、ブラウザへの送信時に、
doubleに変換して送ってはどうでしょうか。

この下の方にある、「素朴な質問・・巨大な数を扱うには?No.5564
という記事も参考にしてみてください。


No.5615

Re:オーバーフロー
投稿者---かずま(2003/03/25 13:13:40)


> Cの計算でオーバーフローを判定することができますか?
符号付きなら、
    c = a + b;
    if (((c^a) & (c^b)) < 0) puts("overflow");

符号無しなら、
    c = a + b;
    if (c < a) puts("overflow");


No.5617

Re:オーバーフロー
投稿者---はいさー(2003/03/25 16:14:10)


<pre>
>符号無しなら、
> c = a + b;
> if (c < a) puts("overflow");
</pre>
について、なぜオーバーフローが判定できるのか教えていただけないでしょうか?
あちしは、プログラミングはじめたばかりなのですが、
a=5でb=-10のとき、c < aとなってしまうのではっと考えてしまうのです。

う〜ん。。。


No.5618

Re:オーバーフロー
投稿者---おっ。(2003/03/25 19:23:15)


>あちしは、プログラミングはじめたばかりなのですが、
>a=5でb=-10のとき、c < aとなってしまうのではっと考えてしまうのです。

かずまさんは
>>符号無しなら、
と言っておられますです。はい。

No.5635

Re:オーバーフロー
投稿者---はいさー(2003/03/27 17:02:35)


はいさーっ!(*@_@*)