打印

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

[复制链接]
1377|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 赞一个!
5
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 很给力!
6
ltalent588| | 2016-11-23 10:11 | 只看该作者
可以巧妙利用共用体,我在modbus通信中就是那么用的
union ex
{
  float  a;
  unsigned char b[4];
};

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
hello_海涛 + 3 很给力!
7
ltalent588| | 2016-11-23 10:12 | 只看该作者
不过共用体也有缺点,就是代码在不同的平台移植的时候,有的cpu是大字节在前,有的是小字节在前,,所以,在modbu发送的时候还得同一改成大字节在前、、、、要是移植好了,用起来就听方便了

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
hello_海涛 + 3 很给力!
8
hello_海涛|  楼主 | 2017-8-3 19:05 | 只看该作者
hgjinwei 发表于 2016-11-23 08:31
float test222=-12.5;
unsigned char buff;

谢谢指导

使用特权

评论回复
9
hello_海涛|  楼主 | 2017-8-3 19:05 | 只看该作者

谢谢指导

使用特权

评论回复
10
hello_海涛|  楼主 | 2017-8-3 19:06 | 只看该作者
wallace_tsou 发表于 2016-11-23 09:59
1. pointer method
void put_float(float a)
{

谢谢指导

使用特权

评论回复
11
hello_海涛|  楼主 | 2017-8-3 19:06 | 只看该作者
ltalent588 发表于 2016-11-23 10:11
可以巧妙利用共用体,我在modbus通信中就是那么用的
union ex
{

谢谢指导

使用特权

评论回复
12
hello_海涛|  楼主 | 2017-8-3 19:07 | 只看该作者
ltalent588 发表于 2016-11-23 10:12
不过共用体也有缺点,就是代码在不同的平台移植的时候,有的cpu是大字节在前,有的是小字节在前,,所以, ...

奥  万分感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

77

帖子

0

粉丝