私は非常に単純なCプログラムを持っています。
int main(void){
double sum = 1/2;
printf("%d\n", sum);
return 0;
}
「-2030243223」のような数値を返すのはなぜですか?
プログラムを実行するたびにこの数値が変わるのはなぜですか?
int と float を使用してみましたが、出力を 0.5 にできないようです!?
私は非常に単純なCプログラムを持っています。
int main(void){
double sum = 1/2;
printf("%d\n", sum);
return 0;
}
「-2030243223」のような数値を返すのはなぜですか?
プログラムを実行するたびにこの数値が変わるのはなぜですか?
int と float を使用してみましたが、出力を 0.5 にできないようです!?
ではなく、を出力するために使用%f
します。後者は未定義の動作を引き起こします。double
%d
また、式1/2
は を生成する整数除算を使用0
するため、 を取得するには(末尾のピリオドに注意).5
を使用します。1/2.
最後に、.5
のようなものの代わりに実際に取得するに0.500000
は、精度を指定します。
printf("%.1f\n", sum);
IEEE 浮動小数点数をに渡していますがprintf
、整数であることを伝えています。
変化する
printf("%d\n", sum);
に
printf("%f\n", sum);
他のコメントで述べたように、おそらく整数除算ではなく浮動小数点除算も行う必要があります。1/2
ゼロです。2 つの整数を除算しているので、結果は整数になり (そうです、それを浮動小数点変数に代入しようとしていますが、各式の型は個別に決定されます)、残りを破棄する必要があります。1.0/2
おそらく代わりに欲しいでしょう。いずれかの項が浮動小数点数の場合、結果は浮動小数点数になるため、0.5 になります。
double を Integer に出力しようとしています。(%d)。
どちらも数値ですが、メモリなど、内部的には大きな違いがあります。
double を int として出力しようとしています。使用してみてください:
printf("%g\n");
また、最初の除算を 1.0/2.0 にするか、そうしないと 0 になります。
これを試して:
int main(void){
double sum = 1.0/2.0;
printf("%10.3f\n", sum);
return 0;
}
コードにはいくつかの問題があります
int main(void){
// you need to divide a double by a double, not two ints
double sum = 1.0/2.0;
// %d is for int, not doubles. You use %f in the case of printing a double
printf("%f\n", sum);
return 0;
}
本当に変数を int として出力したい場合は、 を実行して変数sum
を int としてキャストprintf("%d\n", (int)sum);
できますが、丸めの問題が発生します。
次のことを試してください。
printf("%f\n", sum);
%d は integer のプレースホルダーです。おそらく sum のアドレスが出力されています^^
次の理由から、悪い形式がすべての答えになることはありません。
double
「-2030243223」(0x86FCF269) として表示できなかった 0x0000000000000000 として格納されたゼロでなければなりません。したがって、ヘッダーが欠落しているという事実など、何か他のものがあるに違いありません。コンパイラはprintf
可変引数関数であることを認識せず、浮動小数点レジスタを介して引数を渡そうとします。
printf
は可変引数関数であり、おそらくスタックから入力値を読み取ろうとするため、ガベージです。