2009-07-16 9 views
1
int main() 
{ 
    float f = 12.2; 
    char *p1; 
    p1 = (char *)&f; 
    printf ("%d", *p1); 
} 

この出力51floatポインタをcharポインタに型キャストするとどうなりますか?

+0

いいえ、私はしませんでした。元のソースを読み、正しい場所にポインタがあることがわかります。しかし、キャスト内のポインタとprintf内のポインタは、重心とみなされます。これは明らかにsrie raamが意図したものではありません。 –

+0

次に12.2のIEEE 754表現を見てください。あなたはあなたの理論をサポートしていないことがわかります – EFraim

+0

単精度:41433333 – EFraim

答えて

1
  1. あなたは代わりに(のchar *)の(文字)にキャスト。
  2. 整数として出力します。
  3. したがって、fのアドレスの最下位バイトが得られます。

EDIT:新しいマークアップによると、あなたは本当に(リトルエンディアンのマシン上で)その最下位バイトの浮動小数点表現を切り捨てる

1

ほとんどEFraimが言う、あなたはchar *にキャストしなかったことを除いて、のみをスタックオーバーフローのマークアップが間違っていました。

したがって、fの内部表現の最下位バイト(IEEE-754)が得られます。

+0

いいえ、彼はしませんでした。さもなければ、彼は51を得ませんでした。仮数は0になる可能性は低いです。 – EFraim

+0

コードは現時点では、x86マシンでも51になります。 12.2は(16進数で)33 33 43 41. –

17

あなたはがうまくchar*float*をキャストすることができ、それが問題になることがあり、そのような獣のを使用してです。

逆参照すると、最初の部分の表現が得られます(ただし、実際に何を意味するのかは分かりませんが、考えているほど明確ではありません)。

あなたはIEE754浮かぶ、IEEE754のfloat型で12.2です(ABCDがオクテットです)の話をしている場合:最後に

S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM (sign, exponent, mantissa). 
0 10000010 10000110011001100110011 
a aaaaaaab bbbbbbbccccccccdddddddd 

00110011は、あなたが見ていることを51(0x33の)です。それは(リトルエンディアンアーキテクチャに)メモリに、このように保存されているので、あなたはフロートの最後ビットを見ている理由は次のとおりです。float*char*キャストがでポイントすることを意味し

00110011 00110011 01000011 01000001 
dddddddd cccccccc bbbbbbbb aaaaaaaa 

dddddddd部分。

ビッグエンディアンアーキテクチャでは、aaaaaaaaビット、01000001、または65(0x41)を取得します。

+0

ありがとうございました。 –

1

上記の他の問題が修正されていると仮定すると、その浮動小数点のビットパターンが何であれ、整数バージョンが得られます。浮動小数点はかなり複雑なエンコーディングを持っているので、浮動小数点数に明示的に関係するものは何もありません。

+0

それ以外の場合は、個々のバイトをプリントアウトして、エンコーディングの実際の複雑さを確認することができます:-) – paxdiablo

1

質問です:

フロートはポインタ

正確な答えはcharに型変換されたときに何が起こるか:

未定義の動作。

関連する問題