0

私は非常に単純なCプログラムを持っています。

int main(void){

  double sum = 1/2;

  printf("%d\n", sum);

  return 0;

}

「-2030243223」のような数値を返すのはなぜですか?

プログラムを実行するたびにこの数値が変わるのはなぜですか?

int と float を使用してみましたが、出力を 0.5 にできないようです!?

4

8 に答える 8

11

ではなく、を出力するために使用%fします。後者は未定義の動作を引き起こします。double%d

また、式1/2は を生成する整数除算を使用0するため、 を取得するには(末尾のピリオドに注意).5を使用します。1/2.

最後に、.5のようなものの代わりに実際に取得するに0.500000は、精度を指定します。

printf("%.1f\n", sum);
于 2013-10-09T12:33:32.290 に答える
5

IEEE 浮動小数点数をに渡していますがprintf、整数であることを伝えています。

変化する

printf("%d\n", sum);

printf("%f\n", sum);

他のコメントで述べたように、おそらく整数除算ではなく浮動小数点除算も行う必要があります。1/2ゼロです。2 つの整数を除算しているので、結果は整数になり (そうです、それを浮動小数点変数に代入しようとしていますが、各式の型は個別に決定されます)、残りを破棄する必要があります。1.0/2おそらく代わりに欲しいでしょう。いずれかの項が浮動小数点数の場合、結果は浮動小数点数になるため、0.5 になります。

于 2013-10-09T12:33:47.363 に答える
3

double を Integer に出力しようとしています。(%d)。

どちらも数値ですが、メモリなど、内部的には大きな違いがあります。

于 2013-10-09T12:33:40.237 に答える
3

double を int として出力しようとしています。使用してみてください:

printf("%g\n");

また、最初の除算を 1.0/2.0 にするか、そうしないと 0 になります。

于 2013-10-09T12:33:51.237 に答える
2

これを試して:

int main(void){

  double sum = 1.0/2.0;

  printf("%10.3f\n", sum);

  return 0;

}
于 2013-10-09T12:33:37.783 に答える
1

コードにはいくつかの問題があります

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);できますが、丸めの問題が発生します。

于 2013-10-09T12:35:33.730 に答える
0

次のことを試してください。

printf("%f\n", sum);

%d は integer のプレースホルダーです。おそらく sum のアドレスが出力されています^^

于 2013-10-09T12:36:30.623 に答える
0

次の理由から、悪い形式がすべての答えになることはありません。

  • OP のコードでは、double「-2030243223」(0x86FCF269) として表示できなかった 0x0000000000000000 として格納されたゼロでなければなりません。
  • OPは、この値は常に変化すると言います。

したがって、ヘッダーが欠落しているという事実など、何か他のものがあるに違いありません。コンパイラはprintf可変引数関数であることを認識せず、浮動小数点レジスタを介して引数を渡そうとします。

printfは可変引数関数であり、おそらくスタックから入力値を読み取ろうとするため、ガベージです。

于 2013-10-09T12:47:12.073 に答える