在嵌入式开发中,我们通常是使用C语言的,这个过程往往要进行一些数学计算,过程中不免跟不同类型的变量与常量打交道。那么你有时候遇到的数据类型转换的问题,知道根源与解决方法吗?
今天论坛微信群有朋友就踢出了如下问题:
他定义了如下变量:无符号长整型,使用8位单片机,该系统下该类型变量为32位。
unsigned long int Set_vol;
进行如下的计算操作
Set_vol = 600 * st_WaterHeatCtrl.Set_vol;
其中 st_WaterHeatCtrl.Set_vol=500;
结果是错误的,如下,
然后如下操作仍然错误
正确的结果应该是:0X493E0
那么问题出在哪儿呢。
哈哈,我给他提议是变量加上强制转换。
最后如下方式解决
现在总结问题:
错误原因是如果右边的计算中第一个参与计算因数占位最长的为16位,那么右边计算的最终结果将是16位的,这样计算完会将低16位的结果赋值给左边,无论左边是什么长度的变量。
所以在右边加上强制转换来平衡左右两边是很有必要的。
如果存在常量系数该如何方便的解决呢?
这就可以使用后缀了,常量的后缀类似于强制转换。
后缀U:unsigned
后缀L:long
后缀F:double
比如上面问题中左边是unsigned long int 类型
那么只要右边的系数写成:500ul即可让左边的最长占位达到32BIT,这样右边怎么计算都会按照32位长度来保存了。
实际演示如下:
另外什么长度的数据,鼠标靠近也会在KEIL中显示
那么我们同样可以用一个常量代替强制转换,如下,比如我们给右边的因式前面加上一个1UL参与计算即可。 无后缀情况
如果你定义的常量没有采用任何后缀,例如:125,-100,10.1等编译器会怎么理解呢?
编译器会认为是
整数:int
浮点数:double
同样如果你的算式中是计算一个浮点量,那么里面的常量系数建议写成小数形式,即整数后面补充“.0”
例如10写成10.0
另外如果参与的算式有小数的情况下,或者可能参数小数结果的情况下,定义的常量宏应考虑这些例如:
#define K 273.15
#define T0 (25.0+K)
#define R0 10000.0
#define B 3455.0
另外还药注意一点,常量的类型后缀大小写是等效的。
前缀
同样有时候我们也会用到前缀表示数字进制类型:整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
另外注意一点,C语言中没有2进制数据,所以0B101是非法的,通常如果这么写,编译器会报错:非法8进制数。
现在你学会使用常量后缀完成强制转换了吗?
---------------------
作者:gaoyang9992006
链接:https://bbs.21ic.com/icview-3283686-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。