拿
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
为什么我会看到这个号码?
0101
(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
我错过了什么?
答案 0 :(得分:3)
其他人已经指出它不可移植......但你已经知道了,并且你已经指定了64位OS X.基本上,你的尾数是错误的。 1.25
表示1.0
的隐式前导位。尾数的第一个显式位代表0.5
,第二个位代表0.25
。所以尾数实际上是:01000000000000000000000
。
符号位0
和偏向指数10000001
,后跟尾数给出:
0x40a00000
,1084227584
十进制。
答案 1 :(得分:0)
为什么我会看到这个号码?因为您正在将一个浮点数打印为int。
我知道,我知道,你显然已经知道这一点,但最重要的是行为未定义。你的系统是整数和浮动相同的大小?您是否查找了编译器用于存储浮点的标准?