浮点数移位操作——搬运

1. 浮点数的移位操作

C语言不支持浮点数的移位操作,浮点数的存储和整型数的存储不同,并不是直接将数值表示成二进制形式存储,存储的方式在下表呈现,具体的在这里不多说,浮点数直接移位后基本没有什么意义,但是有时候还是需要进行移位操作,比如使用串口/IIC/CAN等通信时,需要将数据一字节一字节的发送,对于浮点数来说,就需要将浮点数分解成字节,这样常用的有两种方法,一是利用联合体的特点将浮点数分解,二是利用移位操作,移位操作需要一些技巧。
浮点数不能直接使用移位操作,整型可以,所以将浮点数转化为整型数进行移位是可行的,但是这里的类型转化不是类似(int)a这样的强制类型转换,而是将存储整型的数据内存的解释规则转化为整型,比如进行如下操作:

float a;
uint32_t *data = (uint32_t *)&a;

经过这样的操作后,保存数据a的内存,就可以使用data或者(uint32_t )&a解释成整型,并且对data或者(uint32_t )&a进行移位操作把浮点数分解为单个字节并且不改变每一位的值。

2.移位操作VS使用联合体

下面的两段代码都可以将浮点数分解为单字节并进行操作,比较来看,在将数据(并不限制为浮点数)分解为字节倍数的类型时,联合体的操作更加简单易懂,但是移位操作没有这一限制,比使用联合体灵活,但也相对复杂,比较来看,各有千秋。

//浮点数的移位操作
#include "stdint.h"
#include "stdio.h"

int main(void)
{
    double  val = 48646.1123;
    double  Result = 0;

    uint8_t data2[8];


    for (int i = 0;i < 8;i++) {
        data2[i] = ((*(uint64_t *)&val) >> (8 * i)) & 0xff;
    }

    for (int i = 0;i < 8;i++) {
        (*(uint64_t *)&Result) = (*(uint64_t *)&Result) << 8 | data2[7 - i];
    }

    printf("%f", Result);
    system("pause");
}

//使用联合体达到移位操作效果
#include "stdio.h"
#include "stdint.h"
#include "string.h"
int main(void)
{
	union
	{
		uint8_t data[8];
		double  val;
	}test, test2;
	double x = 5.1;
	double re;
	int i;

	test.val = x;
	for (i = 0; i < 8; i++)
	{
		test2.data[i] = test.data[i];
	}
	re = test2.val;


	printf("%f", re);
}

以上转载至:原文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值