C语言中如何 取出 浮点型数据 的字节格式 ?浮点数处理问题

[复制链接]
1979|11
 楼主| hello_海涛 发表于 2016-11-22 23:51 | 显示全部楼层 |阅读模式
各位大侠好,求指导
C语言中如何 取出 浮点型数据 的字节格式 ? 如 : -12.5 在内存中占用4个字节,其字节格式为 0xC1480000
我要把 -12.5这个值通过modbus通信传出去,能通过什么语句取出内存中的这4个字节吗?或者要用什么算法来计算出这4个字节吗?
使用KEILL,C语言编程实验时,我把 指向值为-12.5的变量 的指针 强制转换为unsigned long 然后读取指针下的数据,不好使~~


谢谢您的指导,
 楼主| hello_海涛 发表于 2016-11-23 01:06 | 显示全部楼层
问题解决了   分享一下:
把float数据区看做一块内存区域,通过指向它的指针强制解释为uchar类型就读出来了
例如:
float test222=-12.5;
void *p222=(void*)&test222;
ADD222=*(*unsigned char)(p222);//读出最低位的那个字节
...
ADD555=*((*unsigned char)(p222)+3);//读出最高位的那个字节
hgjinwei 发表于 2016-11-23 08:31 | 显示全部楼层
float test222=-12.5;
unsigned char buff[sizeof(float)];

memcpy(buff,&test222,sizeof(test222));

好了,数据在buff中,想怎么处理,就怎么处理吧

评分

参与人数 1威望 +2 收起 理由
hello_海涛 + 2 很给力!

查看全部评分

wsnsyy 发表于 2016-11-23 08:57 | 显示全部楼层
用union很方便

评分

参与人数 1威望 +2 收起 理由
hello_海涛 + 2 赞一个!

查看全部评分

wallace_tsou 发表于 2016-11-23 09:59 | 显示全部楼层
1. pointer method
void put_float(float a)
{
    char *cp=(char*)&a;
    Output(*cp++);
    Output(*cp++);
    Output(*cp++);
    Output(*cp);
}
float get_float()
{
    float f;
    char *c = (char*)&f;
    c[0] = Input();
    c[1] = Input();
    c[2] = Input();
    c[3] = Input();
    return f;
}
2. structure method
void put_float(float a)
{
    union {
        float f;
        char  c[4];
    }var;

    var.f = a;
    Output(var.c[0]);
    Output(var.c[1]);
    Output(var.c[2]);
    Output(var.c[3]);
}
float get_float(void)
{
    union {
        float f;
        char  c[4];
    }var;

    var.c[0] = Input();
    var.c[1] = Input();
    var.c[2] = Input();
    var.c[3] = Input();
    return (var.f);
}

评分

参与人数 1威望 +2 收起 理由
hello_海涛 + 2 很给力!

查看全部评分

ltalent588 发表于 2016-11-23 10:11 | 显示全部楼层
可以巧妙利用共用体,我在modbus通信中就是那么用的
union ex
{
  float  a;
  unsigned char b[4];
};

评分

参与人数 1威望 +3 收起 理由
hello_海涛 + 3 很给力!

查看全部评分

ltalent588 发表于 2016-11-23 10:12 | 显示全部楼层
不过共用体也有缺点,就是代码在不同的平台移植的时候,有的cpu是大字节在前,有的是小字节在前,,所以,在modbu发送的时候还得同一改成大字节在前、、、、要是移植好了,用起来就听方便了

评分

参与人数 1威望 +3 收起 理由
hello_海涛 + 3 很给力!

查看全部评分

 楼主| hello_海涛 发表于 2017-8-3 19:05 | 显示全部楼层
hgjinwei 发表于 2016-11-23 08:31
float test222=-12.5;
unsigned char buff;

谢谢指导
 楼主| hello_海涛 发表于 2017-8-3 19:05 | 显示全部楼层

谢谢指导
 楼主| hello_海涛 发表于 2017-8-3 19:06 | 显示全部楼层
wallace_tsou 发表于 2016-11-23 09:59
1. pointer method
void put_float(float a)
{

谢谢指导
 楼主| hello_海涛 发表于 2017-8-3 19:06 | 显示全部楼层
ltalent588 发表于 2016-11-23 10:11
可以巧妙利用共用体,我在modbus通信中就是那么用的
union ex
{

谢谢指导
 楼主| hello_海涛 发表于 2017-8-3 19:07 | 显示全部楼层
ltalent588 发表于 2016-11-23 10:12
不过共用体也有缺点,就是代码在不同的平台移植的时候,有的cpu是大字节在前,有的是小字节在前,,所以, ...

奥  万分感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

77

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部