- ベストアンサー
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になってしまい上手くいきませんでした。 どの部分がおかしいのでしょうか・・・;
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No2です。 追記ですが、printfの変換指定子は型にあわせたものを使わなければ正しく表示されません。 long であれば %ld にしてください。
その他の回答 (2)
- zone29
- ベストアンサー率53% (71/132)
16Bitでの(signed)int型があらわせるのは -32768~32767 までです。 (signed)int型で15の二乗の32768はオーバーフローをして-32768になってしまいます。 unsigned int もしくは long を使用してください。
お礼
オーバーフローは考えつきませんでした・・・。 さっそく実行してみます。 (実行中・・・) 答えて頂いたところ申し訳ないのですが、やはり改善しませんでした; unsigned intでもオーバーフローが起こってしまい、 longはNo.1の方と同様に答えが0になってしまいました・・・
- himajin100000
- ベストアンサー率54% (1660/3060)
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); ではないか?
お礼
回答ありがとうございます。 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 となってしまいました; これでは治らなかったようです・・・
補足
出力結果の違いはご指摘の通りです; 乗数のiが表示されてた方がいいかな、と思って付け足したのですが、 書き忘れたようです、すいません。
お礼
重ねてありがとうございます。 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 という結果を出すことができました。 ありがとうございます。