2017-07-17 6 views
0

実際にfloatunsigned longを返す関数があります。私はこのようにそれを投げたときにこのポインタをキャストすると、指された値が変更されるのはなぜですか

printf("%f", foo()); 

それは常に0.00000

をプリントアウトしますが:

私たちは、私はこのようなprintfのために電話をかけるときは、その関数unsigned long foo()

と呼ぶことにします:

unsigned long bar = foo(); 
printf("%f", *((float *)(&bar))); 

floatを正しく出力します。

"%x"との印刷バイナリ表現が異なることがわかります。驚くべきことにunsigned longバージョンは、より多くの私はunsigned longfloatのサイズが同じである私のシステム上でダブルチェックの実際の浮動小数点表現(4000000041ba019a

のように見えます。

だから私の質問は次のとおりです。

この変更のように指摘されているものの値をポインタをキャストするにはどうすればよいですか?

編集:印刷される二重FOOの関連部分は、()は、本質的にフロートは、関数に渡されたときに、最初の二重に促進されるためである

unsigned long foo() 
{ 
    float a = 22.4; 
    return *(unsigned long *)(&a) ; 
} 
+0

あなたは、私たちが最も重要なことを私たちに示しているわけではありません。 'foo()'を見てみましょう。 –

+0

符号なしlongの値は、浮動小数点からキャストされてから始まります。この関数は引数に応じて異なる型を返すことができます。 – rtpax

+0

だから?関連する部分を見てみましょう。 –

答えて

2

ので、printf関数が期待します。 fooはfloatを返さないため、変換は行われません。したがって、printfはパラメータとして他のものを探します。

+0

'double 'への' float'のプロモーションは、すべての関数ではなく、variadic関数(printf()など)に特有です。 – Clifford

+0

@Clifford、あなたは参考になりましたか(私の好奇心のためだけですか?)知りませんでした。 –

+0

http://en.cppreference.com/w/cpp/language/variadic_arguments – Clifford

関連する問題