掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

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

No.25592

整数表示のエラー
投稿者---がりんしゃ(2006/01/22 00:33:52)


単純な問題なのかもしれないのですがどうしても解決できません。

入力した整数値を3乗して出力するプログラムを作成したのですが、一定以上の値になると、マイナスなどが付いた3乗ではない値が出力されてしまいます。

例えば、10000と入力すると「-727379968」と表示されます。

1290までは正しい値が表示されるのですが、1291だと「-2143282125」と表示されてしまいます。
1290の3乗の値は「2146689000」で1291の3乗の値は「2151685171」で、
私の環境でのint型のデータ幅は4バイトでしたので、その表現範囲は「-2147483648〜2147483647」ですよね。
1291だと範囲を超えているので起こるエラーだと思っているのですが、long intでも同じデータ幅なのでそれも解決できません。

入力する値はマイナスも含みたいのでunsigned intではダメなのですが、正側の範囲を増やす為、試しにやってみたところ、unsigned intでも同様のエラーがでます。
このエラーを解決し、1291以上の値も表示させるにはどうすればよいのでしょうか?
宜しくお願いします。

以下は作成したプログラムです。

#include<stdio.h>

int PowerThree(int* value); //プロトタイプ宣言


main()
{
 int value = 0;
 int valueB = 0;

 printf("値を入力してください");
 scanf("%d",&value);
 printf("\n");

 valueB = value;

 PowerThree(&value);

 printf("%dの3乗は%dです",valueB,value);
 printf("\n);

 return(0);
}

int PowerThree(int* value)
{
 *value = (*value)*(*value)*(*value);

 return(*value);
}

環境はWindowsXP,MicrosoftVisualC++です。






この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:整数表示のエラー 25593 επιστημη 2006/01/22 00:39:50
<子記事> Re:整数表示のエラー 25597 nop 2006/01/22 00:53:47
<子記事> Re:整数表示のエラー 25672 二酸化満貫 2006/01/23 17:26:59


No.25593

Re:整数表示のエラー
投稿者---επιστημη(2006/01/22 00:39:50)


> このエラーを解決し、1291以上の値も表示させるにはどうすればよいのでしょうか?

VC++限定ですが、intを_int64に置き換えれば64bit整数となります。



この投稿にコメントする

削除パスワード

No.25597

Re:整数表示のエラー
投稿者---nop(2006/01/22 00:53:47)


> 入力する値はマイナスも含みたいのでunsigned intではダメなのですが、正側の範囲を増やす為、試しにやってみたところ、unsigned intでも同様のエラーがでます。

printf()の「%d」変換子は、渡された値を「signed int」と見なして表示します。
「%u」を使用すると、とりあえず正の数に関しては上限が少し増えるでしょう。

# 負数は出力できなくなるけどね。
#
# 後、__int64を使ったときは、
# printf()の変換子も変えなあかんからね。


この投稿にコメントする

削除パスワード

No.25642

Re:整数表示のエラー
投稿者---がりんしゃ(2006/01/23 00:50:46)


ありがとうございます。

>VC++限定ですが、intを_int64に置き換えれば64bit整数となります
>printf()の「%d」変換子は、渡された値を「signed int」と見なして表示します。
>「%u」を使用すると、とりあえず正の数に関しては上限が少し増えるでしょう。

両方試してみましたが、確かに範囲は多少大きくなりました。
しかし、10000など大きい値にするとやはりダメですね。。

プログラムをチェックされた際に「40000など大きな値を入れたときエラーがでてしまうので適切な対応をしてください」と言われたのですが、範囲を広くしろという意味ではないのだろうか。。。


この投稿にコメントする

削除パスワード

No.25647

Re:整数表示のエラー
投稿者---かずま(2006/01/23 01:23:33)


> 両方試してみましたが、確かに範囲は多少大きくなりました。
> しかし、10000など大きい値にするとやはりダメですね。。

ダメなソースを示してくれないと、なぜダメなのかコメントできません。
#include <stdio.h>

#ifdef __GNUC__   // gcc
    typedef long long Int64;
    #define LL "ll"
#else             // VC++, BCC
    typedef __int64 Int64;
    #define LL "I64"
#endif

int main(void)
{
    Int64 x;

    while (printf("> "), scanf("%"LL"d", &x) == 1)
        if (x > 2097151 || x < 0)
            puts("2097151以下の非負整数を入力してください。");
        else
            printf("%"LL"lld の 3乗 = %"LL"lld\n", x, x * x * x);
    return 0;
}
このプログラムは参考になりますか?


この投稿にコメントする

削除パスワード

No.25666

Re:整数表示のエラー
投稿者---かずま(2006/01/23 11:00:02)


>            printf("%"LL"lld の 3乗 = %"LL"lld\n", x, x * x * x);

訂正します。
             printf("%"LL"d の 3乗 = %"LL"d\n", x, x * x * x);



この投稿にコメントする

削除パスワード

No.25648

Re:整数表示のエラー
投稿者---RAPT(2006/01/23 01:23:57)


あとはPOD型を使うのを諦めて、配列で管理するとか。
多倍長整数について調べてみると良いかもしれません。
# というか、そこまで必要なのかを先に確認した方が良いかも.
# 単にオーバーフローするような数入力時に、エラーではじきたいだけ
# なのかもしれないし。




この投稿にコメントする

削除パスワード

No.25672

Re:整数表示のエラー
投稿者---二酸化満貫(2006/01/23 17:26:59)


int PowerThree(int value)
{
 return value * value * value;
}

私が書くときの書き方です。ご参考まで。
ところで、returnの引数(と言っていいのかな?)
を括弧で囲んでいる意図は何ですか。


この投稿にコメントする

削除パスワード

No.25674

Re:整数表示のエラー
投稿者---がりんしゃ(2006/01/23 20:08:21)


単純なミスでした。
最初のソースのint型を__int64に変えたのですが、変換子でエラーが出てました。なのでかずまさんのソースは非常に参考になりました。ありがとうございます。
__int64では、「-2097151〜2097151」まで入力できます。

これでも十分大きな値で実行できてるので、後は実行時に「○〜○までの整数値を入力してください」などと表示させておけば問題ないと思いますが。。。

unsigned intにしたときは、問題なく動いてます。負数側は表示されませんのでダメですが・・・。

>ところで、returnの引数(と言っていいのかな?)
>を括弧で囲んでいる意図は何ですか。
特に意図はありません。
今までこのように書いてきたので、そう書いているだけですが・・・
ただ、returnで返す値は式ではなく置き換えた値にしろと指示されているので、3乗した値をvalueに入れて返してます。
このような短いプログラムで関数を使ってるのも、そういう指示が出ているというだけの話です。


この投稿にコメントする

削除パスワード

No.25676

Re:整数表示のエラー
投稿者---RiSK(2006/01/23 22:30:10)


>ただ、returnで返す値は式ではなく置き換えた値にしろと指示されているので、3乗した値をvalueに入れて返してます。

?
言いたいことが分からないことはないですが,
指示した方はCに詳しいのでしょうか?

    return value*value*value;
と
    value=value*value*value;
    return value;
の強調部分はどちらも式ですよ。



この投稿にコメントする

削除パスワード

No.25677

Re:整数表示のエラー
投稿者---がりんしゃ(2006/01/23 23:28:04)


指示といいますか、コーディングする際の規則のようなものを決められていて、その規則には、

「デバッグしやすくする為にreturnには計算式を使うな」
 return a + b; //×

 int c = a + b; //○
 return c;

とありました。
私は、returnに使う値を計算式にすると後で直す際にわかりにくくなるので、
計算式を1つの変数に代入してから使うと解釈してたのですが。



この投稿にコメントする

削除パスワード

No.25698

Re:整数表示のエラー
投稿者---REE(2006/01/25 10:21:35)


>「デバッグしやすくする為にreturnには計算式を使うな」

ということなら、 デバッガでcの値を表示したり、
printf("C=%d\n", c); を入れやすいということでしょう。



この投稿にコメントする

削除パスワード

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