C语言 4字节(16进制)转换成浮点数的问题
#include<stdio.h>intmain(void){floata=0.0f;unsignedchar*b=(unsignedchar*)&a;intc[4];i...
#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不相等? 展开
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不相等? 展开
3个回答
展开全部
问题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个字节读取出来,需要按原格式转换为浮点数形式.
回答第二个问题:
浮点数定义的存储格式:(来自百科)
单精度浮点数(Single)
用来表示带有小数部分的实数,一般用于科学计算。
占用4个字节(32位)存储空间,包括符号位1位,阶码8位,尾数23位。其数值范围为-3.4E38~3.4E38,单精度浮点数最多有7位十进制有效数字,单精度浮点数的指数用“E”或“e”表示。
单精度浮点数有多种表示形式:±n.n(小数形式) ±n E ±m(指数形式) ±n.n E ±m (指数形式)
如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入。
应该是传感器得到的是浮点数,通过4个字节读取出来,需要按原格式转换为浮点数形式.
TableDI
2024-07-18 广告
2024-07-18 广告
当我们谈到Python与Excel的拆分时,通常指的是使用Python的库来读取Excel文件中的数据,然后根据某种逻辑(如按行、按列、按特定值等)将数据拆分成多个部分或输出到新的Excel文件中。上海悉息信息科技有限公司在处理这类任务时,...
点击进入详情页
本回答由TableDI提供
展开全部
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);
}
怎么算出来的:
从传感器传过来的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数据。
数据传输和存放,涉及字节流序列。小端码 和 大端码 字节序列 不同。
我上面程序帮你正确显示内存序列了。
如果你的计算机和系统 特殊,不按 寻常 电子设备,别人不熟悉你的系统,便无法帮你了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.定义一个字符指针b,指向变量a的地址。由于类型不兼容,对a的地址进行了强转(前面括号里边的是类型强转)。
2.a的值变成了25.6。跟浮点型的数据的存储方式有关,这个我不清楚。你可以自己搜一下浮点型数据在内存中的存储方式。
3.b是字符类型的指针,对b取值只取8位。a位float型,占32位。
2.a的值变成了25.6。跟浮点型的数据的存储方式有关,这个我不清楚。你可以自己搜一下浮点型数据在内存中的存储方式。
3.b是字符类型的指针,对b取值只取8位。a位float型,占32位。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询