アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語を用いて、2の累乗(2,4,8,16・・・)を
計算して表示するプログラムを

#include<stdio.h>
void main(void)
{
int i,s;
s=1;
for(i=1; i<=15; i++)
{
s=s*2;
printf("i=%2d s=%7d\n",s);
}
}

と打ち込んで実行したのですが、結果が

i= 1 s= 2
i= 2 s= 4
i= 3 s= 8
i= 4 s= 16
i= 5 s= 32
i= 6 s= 64
i= 7 s= 128
i= 8 s= 256
i= 9 s= 512
i=10 s= 1024
i=11 s= 2048
i=12 s= 4096
i=13 s= 8192
i=14 s= 16384
i=15 s= -32768

のように、2の15乗だけが負になってしまいました。
最初のintをdoubleやfloatに直して実行すればよいのかとも考えたのですが、
実行すると答えがすべて0になってしまい上手くいきませんでした。
どの部分がおかしいのでしょうか・・・;

A 回答 (3件)

No2です。



追記ですが、printfの変換指定子は型にあわせたものを使わなければ正しく表示されません。
long であれば %ld にしてください。

参考URL:http://ja.wikipedia.org/wiki/Printf
    • good
    • 2
この回答へのお礼

重ねてありがとうございます。
intやlongばかりに目が行ってて、変換指定子まで目が行ってませんでした・・・;
実行してみたところ、
i= 1 s= 2
i= 2 s= 4
i= 3 s= 8
i= 4 s= 16
i= 5 s= 32
i= 6 s= 64
i= 7 s= 128
i= 8 s= 256
i= 9 s= 512
i=10 s= 1024
i=11 s= 2048
i=12 s= 4096
i=13 s= 8192
i=14 s= 16384
i=15 s= 32768
という結果を出すことができました。
ありがとうございます。

お礼日時:2007/05/13 17:02

16Bitでの(signed)int型があらわせるのは -32768~32767 までです。


(signed)int型で15の二乗の32768はオーバーフローをして-32768になってしまいます。

unsigned int もしくは long を使用してください。
    • good
    • 1
この回答へのお礼

オーバーフローは考えつきませんでした・・・。
さっそく実行してみます。
(実行中・・・)
答えて頂いたところ申し訳ないのですが、やはり改善しませんでした;
unsigned intでもオーバーフローが起こってしまい、
longはNo.1の方と同様に答えが0になってしまいました・・・

お礼日時:2007/05/13 16:51

WinXP Pro SP2 + bcc32で再現しない。


が、long intにすれば治るのではないか?(C言語系俺あまり経験無いし、再現確認してないが)

http://www.st.rim.or.jp/~phinloda/cqa/cqa5.html#Q1

あと、その出力結果得るなら
printf("i=%2d s=%7d\n",i,s);
ではないか?

この回答への補足

出力結果の違いはご指摘の通りです;
乗数のiが表示されてた方がいいかな、と思って付け足したのですが、
書き忘れたようです、すいません。

補足日時:2007/05/13 16:38
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
long intも試してみたのですが、
i= 1 s= 0
i= 2 s= 0
i= 3 s= 0
i= 4 s= 0
i= 5 s= 0
i= 6 s= 0
i= 7 s= 0
i= 8 s= 0
i= 9 s= 0
i=10 s= 0
i=11 s= 0
i=12 s= 0
i=13 s= 0
i=14 s= 0
i=15 s= 0
となってしまいました;
これでは治らなかったようです・・・

お礼日時:2007/05/13 16:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!