如何将float32类型数据直接发送到总线上并在接收端正常解析

在C语言中位操作float32类型数据

can总线发送的数据都是整型数据,对于int类型因为都是整型可以进行位发送,常规的都可以解决,但是对于float32类型的数据因为是浮点类型,没有办法直接进行位操作,在转化过程中就会出现错误问题,而往往的经验都是把float类型进行倍数放大再进行发送,接收时除以相同的倍数。

今天在写程序的时候就在想,其实float32类型最终在计算机里存储的还是32位也就是4个bytes,按说是可以直接转化的,按照常规的位操作后转化成Uint32时的内容是一样的。

// 这里floatdata 和Uintdata位表达都是0xC996B439
float32 floatdata = -1234567.123;
Uint32 Uintdata= (Uint32) floatdata ;
float32 floatdatat = (float32)Uintdata;
//这里的floatdatat 就不在是-1234567.123

到这里我是有一些苦恼的,后来去检索了一下相关内容才知道还有个联合体的概念。只能说明自己学习不扎实,所以在这里和大家分享一下:
联合体(Union)是C语言中一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。在任何给定时间,联合体只能存储其成员之一的值,但所有成员共享相同的内存地址。

以下是联合体的一些关键特性:

1、共享内存:联合体的所有成员都共享同一块内存空间。这意味着无论哪个成员被赋值,它都会覆盖其他成员的值。
2、大小确定:联合体的大小等于其最大成员的大小。这是为了确保联合体可以存储任何类型的成员。
3、类型安全:尽管联合体可以存储不同类型的数据,但编译器仍然会进行类型检查,以确保在访问联合体成员时使用正确的类型。
4、位模式操作:联合体常用于操作数据的位模式,例如在将浮点数转换为整数表示时。
5、内存对齐:联合体的内存对齐可能与它的成员不同,这取决于编译器和平台的内存对齐规则。
6、访问限制:在给定时间只能访问联合体的一个成员。尝试同时访问多个成员可能会导致不可预测的行为。

#include <stdio.h>

// 定义一个联合体,包含一个整数和一个浮点数
typedef union {
    int i;
    float f;
} NumberUnion;

int main() {
    NumberUnion num; // 创建联合体变量

    num.i = 10; // 给整数成员赋值
    printf("Integer value: %d\n", num.i); // 打印整数值

    num.f = 3.14159; // 给浮点数成员赋值,这将覆盖整数成员的值
    printf("Float value: %f\n", num.f); // 打印浮点数值

    return 0;
}

在这个例子中,NumberUnion 联合体可以存储一个整数或一个浮点数。当给 num.i 赋值时,num.f 的值被忽略。同样,当给 num.f 赋值时,num.i 的值被覆盖。

联合体在多种场景下非常有用,例如:

1、数据打包和解包:在网络编程中,将数据打包成字节流发送,然后在接收端解包。
2、硬件访问:在嵌入式编程中,通过联合体访问和修改硬件寄存器。
3、类型转换:在需要将一种数据类型的位模式转换为另一种数据类型时。
使用联合体时,开发者需要小心,确保在任何给定时间只访问一个成员,并且了解不同成员的位模式如何相互影响。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值