
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になってしまい上手くいきませんでした。
どの部分がおかしいのでしょうか・・・;
No.3ベストアンサー
- 回答日時:
No2です。
追記ですが、printfの変換指定子は型にあわせたものを使わなければ正しく表示されません。
long であれば %ld にしてください。
参考URL:http://ja.wikipedia.org/wiki/Printf
重ねてありがとうございます。
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
という結果を出すことができました。
ありがとうございます。
No.2
- 回答日時:
16Bitでの(signed)int型があらわせるのは -32768~32767 までです。
(signed)int型で15の二乗の32768はオーバーフローをして-32768になってしまいます。
unsigned int もしくは long を使用してください。
オーバーフローは考えつきませんでした・・・。
さっそく実行してみます。
(実行中・・・)
答えて頂いたところ申し訳ないのですが、やはり改善しませんでした;
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);
ではないか?
この回答への補足
出力結果の違いはご指摘の通りです;
乗数のiが表示されてた方がいいかな、と思って付け足したのですが、
書き忘れたようです、すいません。
回答ありがとうございます。
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
となってしまいました;
これでは治らなかったようです・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
boolean型の戻り値は可能か
-
すごろくに使用するサイコロ
-
既約分数の表示プログラム
-
最早開始時間と最遅完了時刻を...
-
C言語 エラーの原因がわからな...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
For文の終了値を関数にしても問...
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
std::set<int> で、ある値が何...
-
Enterキーを押されたら次の処理...
-
sscanfとscanfの違いがよくわか...
-
main.c:7:43: warning: implici...
-
#define _CRT_SECURE_NO_WARNIN...
-
InvokeMemberメソッドとは何を...
-
【#define】 defineで定義した...
-
2の補数を計算するプログラム
-
a^2の√=a が成り立たない場合
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
Cプログラムについて
-
コマンドラインに出力した文字...
-
WM_CLOSEで閉じれないウィンド...
-
C言語の&に関する質問
-
すごろくに使用するサイコロ
-
文字と数字の判定について
-
printf( " %2d", p * q );
-
【C言語教えてください】sin波...
-
%P と %X の違い
-
C言語の勉強しています。すみま...
-
strcmp
-
c言語でAからZまでを表示する...
-
unsigned int型について
-
(C言語)めちゃくちゃな値にな...
-
printf で二進表示を行いたい。
-
プログラミング C言語 課題でプ...
-
c言語で2000年以降カレンダーを...
おすすめ情報