【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18457

オーバーフロー
投稿者---霧雨(2004/11/30 01:16:35)


以前ここの掲示板でヒントをいただいた者です。
2つの値の絶対値を表示するプログラムを作成していたのですが、このプログラムでint型で表現できない大きな値が入力されるとオーバーフローが発生してしまいます。
どなたか解決方法を授けて下さると幸いです。

ソースは以下のようになります。


#include <stdio.h>
#include <stdlib.h>

int absolute(int n1, int n2);

int get_int(void)
{
    char buf[256], c; 
    int n; 

    if (!fgets(buf, sizeof buf, stdin) || sscanf(buf, "%d %c", &n, &c) != 1)
        puts("error!!"), exit(1); 

    /*n1、n2に対応する数値を入力
    n1、n2に対し整数以外、-のみ、改行のみが入力された場合は
    「error!!」を表示*/

    return n; 
}

int main(void)
{
    int n1; 
    int n2; 

    n1 = get_int(); 
    n2 = get_int(); 

    while(n1 >= 100000000){
    n1 = n1 / 10; 
                
    /*n1の桁数が9桁以上ならば10で除算し8桁まで減らす*/

    }

    while(n2 >= 100000000){
    n2 = n2 / 10; 
                
    /*n2の桁数が9桁以上ならば10で除算し8桁まで減らす*/

    }

    printf("absolute(n1, n2) = %d\n", absolute(n1, n2)); 
    return 0; 
}

int absolute(int n1, int n2)
{
    return (n1 > n2) ? (n1 - n2) : (n2 - n1); 
}



よろしくお願いいたします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:オーバーフロー 18458 RAPT 2004/11/30 01:35:28
<子記事> Re:オーバーフロー 18459 かずま 2004/11/30 02:40:33


No.18458

Re:オーバーフロー
投稿者---RAPT(2004/11/30 01:35:28)


で、どうしたい?

前回も書いたが…
・文字列で受けて、オーバーフローする桁数になったらはじく。
・LONGLONG型が使えればそれを使う。
・多倍長を使う。


この投稿にコメントする

削除パスワード

No.18459

Re:オーバーフロー
投稿者---かずま(2004/11/30 02:40:33)


#include <stdio.h>
#include <stdlib.h>

int absolute(int n1, int n2) { return n1 > n2 ? n1-n2 : n2-n1; }

void error(void) { puts("error!!"); exit(1); }

int get_int(void)
{
    char buf[256], *p;  int n, minus = 0;

    if (!fgets(buf, sizeof buf, stdin)) error();
    for (p = buf; *p==' ' || *p=='\t'; p++) ;
    if (*p == '-') minus = 1, p++;
    if (*p < '0' || *p > '9') error();
    for (n = *p++ - '0'; *p >= '0' && *p <= '9'; p++)
        if (n <= 9999999) n = n * 10 + (*p - '0');
    while (*p==' ' || *p=='\t' || *p=='\n') p++;
    if (*p) error();
    return minus ? -n : n; 
}

int main(void)
{
    int n1 = get_int(); 
    int n2 = get_int(); 

    printf("absolute(n1, n2) = %d\n", absolute(n1, n2)); 
    return 0; 
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧