実際にfloat
のunsigned long
を返す関数があります。私はこのようにそれを投げたときにこのポインタをキャストすると、指された値が変更されるのはなぜですか
printf("%f", foo());
それは常に0.00000
をプリントアウトしますが:
私たちは、私はこのようなprintfのために電話をかけるときは、その関数unsigned long foo()
と呼ぶことにします:
unsigned long bar = foo();
printf("%f", *((float *)(&bar)));
floatを正しく出力します。
"%x"
との印刷バイナリ表現が異なることがわかります。驚くべきことにunsigned long
バージョンは、より多くの私はunsigned long
とfloat
のサイズが同じである私のシステム上でダブルチェックの実際の浮動小数点表現(40000000
対41ba019a
)
のように見えます。
だから私の質問は次のとおりです。
この変更のように指摘されているものの値をポインタをキャストするにはどうすればよいですか?
編集:印刷される二重FOOの関連部分は、()は、本質的にフロートは、関数に渡されたときに、最初の二重に促進されるためである
unsigned long foo()
{
float a = 22.4;
return *(unsigned long *)(&a) ;
}
あなたは、私たちが最も重要なことを私たちに示しているわけではありません。 'foo()'を見てみましょう。 –
符号なしlongの値は、浮動小数点からキャストされてから始まります。この関数は引数に応じて異なる型を返すことができます。 – rtpax
だから?関連する部分を見てみましょう。 –