2016-06-15 12 views
-2

は、これら二つのプログラムを考えてみましょう:printfはどのように機能しますか?なぜ出力が異なるのですか?

#include <stdio.h> 

int main() 
{ 
    int z = 6.4; 
    printf("%d %d", z, 6.4); 
    return 0; 
} 

出力が6 -1717986918です。

#include <stdio.h> 

int main() 
{ 
    int z = 6.4; 
    printf("%d %d", 6.4, z); 
    return 0; 
} 

出力は-1717986918 1075419545です。

なぜ出力はそのように異なりますか? zが最初の場合、zの値は6となります。zは整数ですが、引数を逆にした場合、出力は異なる値になります。それはなぜそれのように振る舞うのですか?

+0

私はこれをC言語と見なしますが、C++としてコンパイルしても同じ結果になると思います。言語タグでより多くの人が見えるかもしれません。 – doctorlove

+0

私はコンパイラの警告を受け取ります。 。しかし、それはコンパイルし、両方の時に2つの6を印刷します。どのコンパイラを使用していますか? –

+0

@JanezKuhar Codeblocks –

答えて

2

6になるように、6.4を整数に格納します。 6はprintfに渡され、と解釈され、に渡された値が小数として解釈され、正しい出力が表示されます。

しかし、あなたはprintfに直接浮動小数点数を渡し、フォーマット%dを指定した場合、それはまた、そのフロートの小数の解釈になります小数としてそれを解釈します。

この解釈はビットレベルで行われます。 Floatは内部的にはかなり複雑な形式で格納されています。しかし、整数のようではありません。 これらのビットはインタープリタを整数として取得しますが、結果は人間にとっては判りません。しかし、プログラムは実際にその整数を浮動小数点として解釈し、この動作を逆転させることができます。

Thisサイトでは、浮動小数点がビットレベルでどのように格納されるかを実演します。

そして、thisウェブサイトでは、以前のサイトのビットを、質問で指定した負の数値を出力する符号付き整数に変換することができます。

+0

しかし、2番目のプログラム%dはzのために使われていますが、まだ出力されていません。 –

+0

これはprintfが内部でvarargを使い、間違った読み込みのこの行をもう一度試してくださいが、 '6.4f'をパラメータとして使用してください。私はこれが起こっていると考えています。なぜなら、コンパイラは6.4をdoubleとして渡し、したがって第2の '%d'はそのdoubleの後半を読み込んでいるからです。しかし、私は間違っているかもしれません。 –

+2

間違った型を渡すと、定義されていない動作、期間が発生します。 'printf'は渡されたデータから値を取得しないかもしれないし、後の引数も間違った場所にあるでしょう。実際の行動を精緻化しようとするのは問題です。 – chqrlie

関連する問題