0

重複の可能性:
浮動小数点値をC言語で整数で出力します

私はこのようなかなり単純なコードを試しています:

float a = 1.5;
printf("%d",a);

印刷し0ます。ただし、1.4、1.21などの他の値の場合は、ガベージ値が出力されます。1.5だけでなく、1.25、1.5、1.75、1.3125(つまり、完全に2進数に変換できる10進数)の場合は、印刷され0ます。この背後にある理由は何ですか?私はここで同様の投稿を見つけました、そして最初の答えは素晴らしい答えのように見えます、しかし私はそれを識別することができませんでした。なぜこれが起こっているのか、誰かが説明できますか?エンディアンネスはtと何の関係がありますか?

4

4 に答える 4

2

フロートをキャストしているのではなくprintf、整数として解釈しているだけなので、一見ゴミの値を取得しているように見えます。

編集:

double次のCコードの例を確認してください。これは、aがメモリにどのように格納されるかを示しています。

int main()
{
    double a = 1.5;
    unsigned char *p = &a;
    int i;

    for (i=0; i<sizeof(double); i++) {
        printf("%.2x", *(p+i));
    }
    printf("\n");
    return 0;
}

1.5それを実行すると、

000000000000f83f

1.41で試してみると、

b81e85eb51b8f63f

したがって、intとしてprintf解釈する場合1.5、4 LSBはゼロであり、他の値を使用しようとすると、ゼロが出力されます1.41

そうは言っても、これは未定義の動作であり、回避する必要があります。さらに、マシンと引数の受け渡し方法によっては、常に同じ結果が得られるとは限りません。

注:これは小さなインドのマシンでコンパイルされるため、バイトが逆になります。つまり、最下位バイトが最初に来るということです。

于 2012-11-01T17:06:31.233 に答える
1

あなたは議論の昇進を気にしません。は可変個引数関数であるためprintf、引数は昇格されます。

C11(n1570)、§6.5.2.2
タイプfloatを持つ関数呼び出し引数はdoubleにプロモートされます。

したがって、変数を整数型としてprintf解釈しようとします。double未定義の動作につながります。キャストを追加するだけです:

double a = 1.5;
printf("%d", (int)a);
于 2012-11-01T17:10:33.333 に答える
1

の引数の不一致printfundefined beahivour 、型キャストaまたは使用のいずれかです%f

このように使用する

printf("%d",(int)a);

また

printf("%f",a);
于 2012-11-01T17:10:42.863 に答える
0

dは:を表しますdecimal。したがって、aはfloat / double / integer / char、....: "%d"を使用すると、Cはその数値を10進数で出力します。したがって、aが整数型(integer、long)の場合、問題はありません。aがcharの場合:charは整数の一種であるため、Cはcharの値をASCIIで出力します。

ただし、aがfloat型(float / double)の場合、aがfloat型の場合、Cにはこれを読み取る特別な方法がありますが、10進数ではないため、問題が発生します。したがって、奇妙な結果になります。

なぜこの奇妙な結果が出たのですか?

簡単に説明します。コンピューターでは、実数は2つの部分で表されexponentますmantissa。あなたが言うなら:これは実数です、Cはどちらが指数であるか、それが仮数であるかを知っています。しかし、あなたが言うので:ねえ、これは整数です。指数部分と仮数部分の間に違いはありません->奇妙な結果。

正確に理解したい場合は、どの整数が出力されるかをどのように知ることができますか(もちろん、それを推測できます)。このリンクにアクセスできます:Cのメモリ内のFLOAT番号を表します

この奇妙な結果を望まない場合は、intfloatにキャストできるため、float数値の整数部分が出力されます。

 float a = 1.5;
   printf("%d",(int)a);

この助けを願っています:)

于 2012-11-01T17:14:39.653 に答える