1

これは簡単な質問かもしれませんが、float 変数がメモリにどのように格納されているのか、なぜこのように動作しているのかについてはわかりません。誰か次の動作について説明してください。

#include<stdio.h>

int main ()
{
    int a = 9/5;
    printf("%f\n", a);
    return 0;
}

出力:

0.000000

float 変数がメモリにどのように格納されるかについていくつかの情報を見てきましたが、仮数、指数、および符号に関する情報が含まれています。しかし、ここでそれを関連付ける方法がわかりません。

4

5 に答える 5

6
int a = 9/5;

は整数除算を実行し、剰余を無視するため、a1 に設定されます。これを使用して印刷しようとすると、%f未定義の動作が発生しますが、たまたまそれを回避できまし0.000000た。

行う

double a = 9./5.;

代わりに、または%d整数除算が望ましい動作である場合に印刷します。(floatも機能しますが、に渡さaれると に昇格されるため、 を使用しない理由はありません。)doubleprintfdouble

于 2012-10-25T10:01:27.613 に答える
1

これは未定義の動作です。

float 書式指定子 ( %f) を使用して int ( a) を出力しています。%d正しい出力を表示するために使用する必要があります。

于 2012-10-25T10:01:42.330 に答える
1

これは C では定義されていない動作です。%dの代わりに書式指定子を使用します%f

printf() はフォーマット指定子の順序に依存しますか? 詳細な回答を提供します。

于 2012-10-25T10:00:43.937 に答える
0

コードの簡単な分析は次のとおりです。

int a = 9/5; // 9/5 = 1.8, but since you are doing integer division and storing the value in an integer it will store 1.
printf("%f\n", a);//Using incorrect format specifiers with respect to datatypes, will cause undefined behavior

printf("%d\n",a);//This should print 1. And correct.

または、フロートが必要な場合:

int使用する代わりにfloat:

   float a=9.0f/5;//This will store 1.800000f
   //float a=9/5 will store 1.000000 not, 1.8 because of integer divison 
   printf("%f\n",a); //This will print 1.800000

浮動小数点の仕組みについては、 http: //en.wikipedia.org/wiki/IEEE_754-2008もお読みください。

整数除算に関する説明:

C99: 6.5.5 乗法演算子

6整数が除算されると、/演算子の結果は小数部分が破棄された代数商になります。88)a/bが表現可能な場合、式(a/b)*b + a%bは次のようになります。a

88)これはしばしば「ゼロに向かう切り捨て」と呼ばれます。

于 2012-10-25T10:05:06.280 に答える
-1

通常の数学では、割り算が分数になると想定するだけで、魔法のように浮動小数点になることはありません。

int a = 9/5;

使用する必要があります

float a = 9.0/5;

最初に、float を格納するための適切なデータ型、つまり float (精度を上げるには double) が必要です。

第 2 に、2 つの整数、つまり 9 と 5 を除算する場合は、単純に整数除算に従います。つまり、除算の整数部分のみを保存し、残りを破棄します。それを避けるために、9 の後に .0 を追加しました。これにより、コンパイラは暗黙的に float に変換され、除算が行われます。

0 を出力している理由についての言及については、整数で %f を試行することは未定義の動作であることが既に述べられています。技術的には、float は 3 バイトの数値と 1 バイトの指数を含む 4 バイトであり、これらを組み合わせて結果の値を生成します。

于 2012-10-25T10:02:34.513 に答える