int main()
{
float f = 12.2;
char *p1;
p1 = (char *)&f;
printf ("%d", *p1);
}
この出力51floatポインタをcharポインタに型キャストするとどうなりますか?
int main()
{
float f = 12.2;
char *p1;
p1 = (char *)&f;
printf ("%d", *p1);
}
この出力51floatポインタをcharポインタに型キャストするとどうなりますか?
EDIT:新しいマークアップによると、あなたは本当に(リトルエンディアンのマシン上で)その最下位バイトの浮動小数点表現を切り捨てる
ほとんどEFraimが言う、あなたはchar *にキャストしなかったことを除いて、のみをスタックオーバーフローのマークアップが間違っていました。
したがって、fの内部表現の最下位バイト(IEEE-754)が得られます。
いいえ、彼はしませんでした。さもなければ、彼は51を得ませんでした。仮数は0になる可能性は低いです。 – EFraim
コードは現時点では、x86マシンでも51になります。 12.2は(16進数で)33 33 43 41. –
あなたはがうまく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)を取得します。
ありがとうございました。 –
上記の他の問題が修正されていると仮定すると、その浮動小数点のビットパターンが何であれ、整数バージョンが得られます。浮動小数点はかなり複雑なエンコーディングを持っているので、浮動小数点数に明示的に関係するものは何もありません。
それ以外の場合は、個々のバイトをプリントアウトして、エンコーディングの実際の複雑さを確認することができます:-) – paxdiablo
質問です:
フロートはポインタ
正確な答えはcharに型変換されたときに何が起こるか:
未定義の動作。
いいえ、私はしませんでした。元のソースを読み、正しい場所にポインタがあることがわかります。しかし、キャスト内のポインタとprintf内のポインタは、重心とみなされます。これは明らかにsrie raamが意図したものではありません。 –
次に12.2のIEEE 754表現を見てください。あなたはあなたの理論をサポートしていないことがわかります – EFraim
単精度:41433333 – EFraim