C语言的常量后缀你知多少?

在嵌入式开发中,我们通常是使用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所有,任何人未经允许禁止转载。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值