• ベストアンサー

2の累乗を計算するプログラムを作ったのですが・・・

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になってしまい上手くいきませんでした。 どの部分がおかしいのでしょうか・・・;

質問者が選んだベストアンサー

  • ベストアンサー
  • zone29
  • ベストアンサー率53% (71/132)
回答No.3

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

参考URL:
http://ja.wikipedia.org/wiki/Printf
arg-rapid
質問者

お礼

重ねてありがとうございます。 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 という結果を出すことができました。 ありがとうございます。

その他の回答 (2)

  • zone29
  • ベストアンサー率53% (71/132)
回答No.2

16Bitでの(signed)int型があらわせるのは -32768~32767 までです。 (signed)int型で15の二乗の32768はオーバーフローをして-32768になってしまいます。 unsigned int もしくは long を使用してください。

arg-rapid
質問者

お礼

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

回答No.1

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); ではないか?

arg-rapid
質問者

お礼

回答ありがとうございます。 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 となってしまいました; これでは治らなかったようです・・・

arg-rapid
質問者

補足

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

関連するQ&A