C语言 4字节(16进制)转换成浮点数的问题

#include <stdio.h>
int main(void)
{

float a=0.0f;

unsigned char * b = (unsigned char*)&a;

int c[4];

int i = 0;

c[0]=0xCD;

c[1]=0xCC;

c[2]=0xCC;

c[3]=0x41;

//scanf("%x %x %x %x", c+1, c, c+3, c+2);

printf("b1:%d\n",b);

for(i = 0; i<4; i++) b[i] = (unsigned char)c[i];

printf("b2:%d\n",*b);

printf("%f\n", a);

printf("a:%d\n",a);
}

如上面的程序,我感觉很奇怪,16进制数CD CC CC 41 是从传感器传过来的,代表一个温度(25.6),我有三个问题:
1 unsigned char * b = (unsigned char*)&a;这句话执行后b是a的引用吗?还是仅仅是传值?
2 为何这么转换后a的值回变成25.6??怎么算出来的??
3 为何b2与a不相等?

问题1,3楼上已经解答很清楚了
回答第二个问题:
浮点数定义的存储格式:(来自百科)

单精度浮点数(Single)
用来表示带有小数部分的实数,一般用于科学计算。
占用4个字节(32位)存储空间,包括符号位1位,阶码8位,尾数23位。其数值范围为-3.4E38~3.4E38,单精度浮点数最多有7位十进制有效数字,单精度浮点数的指数用“E”或“e”表示。
单精度浮点数有多种表示形式:±n.n(小数形式) ±n E ±m(指数形式) ±n.n E ±m (指数形式)
如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入。

应该是传感器得到的是浮点数,通过4个字节读取出来,需要按原格式转换为浮点数形式.
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-02
unsigned char * b = (unsigned char*)&a; 指针b, 指向a的首地址。
怎么算出来的:
从传感器传过来的CD CC CC 41, 小端码的话,四个字节内容 变化 为 0x41cccccd
转 float 为 25.6。
你可以 自己 用 联合体 研究:
union U{
float v;
unsigned char c[4];
unsigned int i;
}uu;

main(){
uu.c[0]=0xcd;
uu.c[1]=0xcc;
uu.c[2]=0xcc;
uu.c[3]=0x41;
printf(" %f %x",uu.v,uu.i);
}追问

什么小端码?float类型的25.6的内存表示是0xa000000

追答

float类型内存表示 请阅读 IEEE 754-2008 国际标准。计算机按此标准存放float数据。

数据传输和存放,涉及字节流序列。小端码 和 大端码 字节序列 不同。

我上面程序帮你正确显示内存序列了。

如果你的计算机和系统 特殊,不按 寻常 电子设备,别人不熟悉你的系统,便无法帮你了。

本回答被提问者采纳
第2个回答  2013-10-29
1.定义一个字符指针b,指向变量a的地址。由于类型不兼容,对a的地址进行了强转(前面括号里边的是类型强转)。
2.a的值变成了25.6。跟浮点型的数据的存储方式有关,这个我不清楚。你可以自己搜一下浮点型数据在内存中的存储方式。
3.b是字符类型的指针,对b取值只取8位。a位float型,占32位。
相似回答