其实你还不懂计算机和c语言(1)

这篇博客讨论了一段Qt项目的代码,涉及CAN数据解析和界面显示。原始代码对两个字节组合并除以10来获取温度值,并通过复杂的条件判断处理正负号。作者提出了一种简化方案,通过强制类型转换和Qt内置函数实现更简洁的温度值处理和显示。强调了理解计算机基础理论和正确使用类型转换的重要性。
摘要由CSDN通过智能技术生成

我写出来的目的,还是希望大家一起学习一起进步。绝不是显摆和批评。

最近手里又换了一个项目,一个Qt的,本质上还是一段c代码吧。

首先,有图有真相。

 

 

 

这段代码只是其中一个小的数据处理部分,拿过来当个典型处理吧。

1.1 解释一下代码的功能

如果你一眼能看出来最好。看出来的直接跳过吧。

第一张图片:这一段是一个缓存(是can收到的数据),然后对这个缓存的数据做解析,解析出来的是个温度值,看代码的意思呢,是有一位小数。这个温度值保存在两个字节中,发过来的时候是整数,就是乘10了(这里由发送方已经处理了,上述代码中没有这个部分),然后我收到之后需要先把两个字节组合起来(为什么要组合?因为对方在发送的时候就是一个字节一个字节发送的,我接收的也是一个字节一个字节的,我收到之后当然要处理一下啦。),然后除10,得到一个真正的温度值,而且还有一位小数。

注意还有一个标志(temp_zhengfu[0] = 1;这种哈),设置为0或者1.在程序的后面,看情况去加正负号。

第二张图片,主要是qt上的显示了,就是收到的温度值显示在界面上。

但是为什么搞得这么复杂,还if else呢?

我想这哥们肯定遇到了一个问题,就是对方传过来一个负的温度,然而这里显示的是一个大的正数,所以这哥就这么操作了一下。(计算机你不行吧,放开它,让我来)

因为要显示一个正数和负数,直接去判断最高位(这个思想是没毛病的,我们的理论不是都说,最高位是符号位吗?)

我看到这个代码的时候,我喷了。。。。还得我自己去判断最高位,然后还得做取反???难道Qt连数据的正负都判断不了了?

还有一些新值存起来的操作,可能考虑就是加速运行吧。(我直接忽略了)

意思就是这个意思,不知道大家明白了吗?

其实根本不用这么费心。

第二,避坑。

看我写的代码,如此简单,就可以了呀。

 

temp_new[0] = float((dat[3]<<8|dat[2]))/10;    //如果去掉short的强制类型转换,得到的确实是个大的正数(因为默认转换是int类型,32位的,高位填充0)。加上short(强制类型转换)之后,这两个字节正好是short类型的字节大小,最高位系统自动识别为符号位。所以493行,得到的就是一个有正负号的一位小数。

497行,直接用qt自带的函数处理为字符串就好了,然后显示到界面上。

这里的关键点,计算机去看一个没有类型的数字的时候,默认是int类型,而(接收到的)这16位数,扩展到32位时(高位全部补0),最高位是0,所以计算机不能识别位负数。

那最好就是能够直接让计算机认为它就是16位的,这样就能够直接处理正负的问题啦。(这就是强制类型转换的意义呀,所以平时你为什么要强制类型转换呀?????)

3.简单是简单,但是你一定要有计算机的基础理论知识,你说呢?

好了,有问题的小伙伴们,欢迎加我哦。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大智兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值