我写出来的目的,还是希望大家一起学习一起进步。绝不是显摆和批评。
最近手里又换了一个项目,一个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.简单是简单,但是你一定要有计算机的基础理论知识,你说呢?
好了,有问题的小伙伴们,欢迎加我哦。。。