3

取った

int x = 5;
float y = x;

//"I know it's a float .. you know it's a float .. but take it's address
// and pretend you're looking at an integer and then dereference it"

printf("%d\n", *(int*)&y); //1084227584

なぜこの番号が表示されるのですか?

  • バイナリの5は0101
  • 5は、と考えることができます(1.25 * 2^2)。つまり、

次のように表すことができます:

[sign bit]                              - 0
[8 bits worth of exp] - 129 (129-127=2) - 1000|0001
[23 bits of .xxxxxxx] - 25              - 1100|1

まとめると、私は

[sign bit][8 bits worth of exp][23 bits worth of .xxx]
0         10000001             11001000000000 //2126336

何が足りないのですか?

4

2 に答える 2

3

他の人はそれが移植性がないことを指摘しました...しかしあなたはすでにこれを知っていて、あなたは64ビットOS Xを指定しました。基本的に、あなたは仮数が間違っています。1.25の暗黙の先行ビットで表され1.0ます。仮数の最初の明示的なビットは0.5、2番目のビットを表します0.25。したがって、仮数は実際には次のようになります01000000000000000000000

符号ビット0、およびバイアスされた指数10000001の後に仮数が続く と、次のようになります。0x40a00000これは108422758410進数です。

于 2012-04-18T01:35:38.263 に答える
0

なぜこの番号が表示されるのですか?浮動小数点数をintとして出力しているためです。

私は知っています、私は知っています、あなたは明らかにこれをすでに知っています、しかし肝心なのは振る舞いが未定義であるということです。あなたのシステムには同じサイズのintとfloatがありますか?コンパイラがフローティングポイントを格納するために使用する標準を調べましたか?

于 2012-04-18T01:25:19.900 に答える