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和第二个位0.25。所以尾数实际上是:01000000000000000000000

符号位0和有偏指数10000001,后跟尾数给出: 0x40a00000这是1084227584十进制。

于 2012-04-18T01:35:38.263 回答
0

为什么我看到这个号码?因为您将浮点数打印为 int。

我知道,我知道,您显然已经知道这一点,但最重要的是行为是未定义的。在您的系统上,整数和浮点数的大小相同吗?您是否查看过编译器用于存储浮点的标准?

于 2012-04-18T01:25:19.900 回答