浮点数转十六进制,实用!!!

浮点转十六进制 函数如下:

/*作用:浮点数---转---十六进制 */

union fnum

{

long int m;

float f;

};

 

 

然后需要在引用的函数内声明共用体比如:

union fnum num;

用法:共用体是将 多个成员变量共用一个地址,并且同一时刻只允许1个成员变量被赋值,当某个成员变量修改后,其他的成员立刻改变,

比如:num.f=6.91;那么num.m=0x40DD1EB8;

当num.f=6.0时,另一个成员变量也改变num.m=40C00000

因为,单片机的十进制和十六进制都可以进行直接计算,所以用以上办法就可以实现浮点数转十六进制.

通俗的讲:共用体就像一个容器,成员变量就是不同形状的容器出口,当我们把1个圆形的物体放进去,如果这时我们像要一个方形的物体,那么就从方形的出口将物体取出,就得到方形了,(就像做蛋糕,挤奶油的时候 有五角星形的/三角形/大的/小的 出口模具,想要得到什么形状的奶油,就用什么样的出口模具)

同理,我们要浮点转十六进制,就把浮点放进共用体(num.f=6.91),然后从整形取出( Rec=num.m )  

这样就把浮点数 转换成了 十六进制的数  存到了Rec这个变量中了

这里的Rec是我定义32位的1个变量,也可以叫啊猫啊狗,只要是32位就行,

细节问题:

因为浮点数转成十六进制后,通常都是32位数据,所以我们在取出整形数的时候要 用一个32位的变量(long int,或者u32 ) 去存.

 

/*-------------------下面的可以不看-----------------*/

 

 

2. 共用体和结构体的区别

  共用体和结构体有下列区别:

  1. 共用体和结构体都是由多个不同的数据类型成员组成,

  但在任何同一时刻, 共用体只存放了一个被选中的成员, 而结构体的所有成员都存在。

  2. 对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了,

  而对于结构体的不同成员赋值是互不影响的。 另外要注意的是,


下面是串口接收浮点数的讲解

计算串口接收到的浮点数:

我们通常在接收到串口的数字时, 基本上都是文本类型的数字, 并且是一位一位的文本,

比如6.19就是 ‘6’, ’.’ , ’1’ , ’9’

我们将它重新变为6.19需要进行一下操作:

Arr[]={‘6’,’.’,’1’,’9’}

1. 所有文本类型的数字只有 减零 之后才可以进行计算,否则是文本型.

  Arr[0]-‘0’;

2. 特别注意

 

sum_num= (float)(arr[6]-'0')+

(float)(arr[8]-'0')/10 +(float)(arr[9]-'0')/ 100;

在计算的时候,小数部分要转换成 小数,然后进行相加,

注意的是 在(float) (arr[8]-'0')/10的时候, 前面要先强制装换成(float)之后 才可以/10,这样才是把 1变成0.1,

如果在/10之前 没有(float)的话,意味着取10的倍数,

如果是 1/10,不加(float),那就等于0;最后相加就等于6.00000;

正确如下:

3. 注意细节:

成功将Arr[]={‘6’,’.’,’1’,’9’}

组合成sum_num =6.19之后, 在进行判断sum_num时:

if(sum_num == 62.91f) { LED1=0; }

注意这里的62.91后面加f,如果不加会报警告:

:单精度操作数隐式转换为双精度

当if(sum_num == 62.91) { LED1=0; }

这里的sum_num是浮点型,而62.91默认是双精度类型的;

当2个不同类型的变量 相加减时,会将二者都转换成较大一方的类型,

所以 浮点数 和 双精度进行判断时:浮点数会被转换成双精度.所以会报警告,告诉你这里进行了这样的操作.

当if(sum_num == 62.91f) { LED1=0; }这里的62.91f

是将62.91转换成浮点数

浮点数 和 浮点数进行判断 或者 计算,并不会转换成双精度,警告自然没了

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值