C语言浮点型存储方式

看以下代码:
#include <stdio.h>
int main() {
int n = 6;
float* pFloat = (float*)&n;
printf("n=%d\n",n);
printf("*pFloat=%f\n",*pFloat);
*pFloat = 6.0;
printf("n=%d\n",n);
printf("*pFloat=%f\n",*pFloat);
printf("n=%f\n",n);
}

输出结果:
n=6
*pFloat=0.000000
n=1086324736
*pFloat=6.000000
n=0.000000 (这个不应该输出6.000000吗?)

printf("n=%f\n",n);
因为n是int型,是不能用浮点型格式%f输出的,输出结果一定是0

你的第四行有错误,
两边类型不一致
左边是 float*
右边是float
导致做右不一致,没报错也就怪了。

百度计算机浮点格式

union Val
{
    char charVal[4];
    int intVal;
    float floaVal;
};

union Val val;
val.floaVal=6.0;
printf("%d",val.intVal);

浮点数和整数在内存中的表达方式是不一样的!
整数6二进制是110
但是浮点数6.0二进制不可能是110的,它的低位都是0,所以只要把整数改为浮点形式,它在内存中的表现方式就完全变了,所以你永远输不出原来那个6。

http://t.csdn.cn/uwDpp 兄弟看一下这篇博客,可以解答你的疑问

你这个输出完全没毛病。
你的疑问应该在n 的值为1086324736,这个值在内存 4个字节十六进制数为 40C0 0000,假如这里的内存地址为0x1234
注意,我们说的6,是十进制叫法, 如果是float 类型,那么内存中0x1234就是这样存放的:float 的32bits,分别是 0 ~22 为小数部分,23 ~ 30 为 指数部分,31 为符号部分
那么,6 经过float 转换后,指数为 2+127 = 129,二进制为 1000 0001;小数部分为1000 000000000,符号位位0,合并在一起就是:
0 1000 0001 1000 0000 0000 0000 000,最终16进制就是 40C0 0000,也就是n 的值