1

次のコードの場合:

#include <stdio.h>
int main(){
    printf("%f", 5);
    printf("%d", 5.01);
}

最初のステートメントは0.000000を出力し、2番目のステートメントは多数を出力します。

printfは、%fの形式でスタックから4バイトの引数をポップすることを確認したと思います。次に、printf関数がfloatをdoubleに変換する、つまり8バイトの引数になるという参照をいくつか調べました。だから私はそれが予測できない値を出力するかもしれないと思った。しかし、どうすれば0.000000を印刷できますか。

2つ目も堕落しています。5.01のバイナリ形式は01000000101000000101000111101100(0x40A051EC)である必要があり、10進数形式では1084248556である必要がありますが、ステートメントの結果は1889785610です。これが発生するのはなぜですか。

4

3 に答える 3

4

これは紛らわしいですが%d、のような整数の形式です(ほとんどの人は、floatの場合な%iので、doubleの場合と予想しますが、そうではありません)。%fダブルでは使用できません。使用する必要があります%f。と同じように%f、整数を使用することはできません。フロートまたはダブルを使用する必要があります。

また、printf使用するタイプはチェックせず、バイトを指定したタイプとして盲目的に解釈します。間違ったタイプを間違ったタイプ指定子で使用すると、未定義の動作が発生します。そのため、自分が何であるかがわかります。

于 2012-05-01T14:14:08.473 に答える
2

最初のケースではprintfdouble(のために%f)を拡張しますが、を渡しますint。の形式doubleは異なる形式ですint(最もよく使用される形式についてはIEEE-754doubleを参照してください)

2番目も同様です:(のために)をprintf期待しますが、あなたはint%ddouble

間違ったタイプを渡したときに実際の値がどのように解釈されるかは定義されていません(エンディアンなどに依存する可能性があります)

于 2012-05-01T14:16:11.173 に答える
1

printfはタイプセーフではありません。印刷するデータタイプに適切なフォーマット記述子を使用していることを確認する必要があります。そうしないprintfと、生成される結果が保証されません。

于 2012-05-01T14:14:20.953 に答える