12下一页
返回列表 发新帖我要提问本帖赏金: 20.00元(功能说明)

[牛人杂谈] C语言的常量后缀你知多少?

[复制链接]
2916|22
 楼主| gaoyang9992006 发表于 2023-2-13 16:07 | 显示全部楼层 |阅读模式
本帖最后由 gaoyang9992006 于 2023-2-13 19:15 编辑

#申请原创#@21小跑堂 [/url]
在嵌入式开发中,我们通常是使用C语言的,这个过程往往要进行一些数学计算,过程中不免跟不同类型的变量与常量打交道。那么你有时候遇到的数据类型转换的问题,知道根源与解决方法吗?
今天论坛微信群有朋友就踢出了如下问题:
他定义了如下变量:无符号长整型,使用8位单片机,该系统下该类型变量为32位。
  1. unsigned long int Set_vol;
进行如下的计算操作
  1. Set_vol = 600 * st_WaterHeatCtrl.Set_vol;
其中 st_WaterHeatCtrl.Set_vol=500;
结果是错误的,如下,
2852563e9ec0a0251f.png
然后如下操作仍然错误
2207263e9ec3e84780.png

6377463e9ec49bf2d8.png
正确的结果应该是:0X493E0
那么问题出在哪儿呢。
9603363e9ec96646de.png
哈哈,我给他提议是变量加上强制转换。
最后如下方式解决
3201063e9ecb88c61e.png
现在总结问题:
错误原因是如果右边的计算中第一个参与计算因数占位最长的为16位,那么右边计算的最终结果将是16位的,这样计算完会将低16位的结果赋值给左边,无论左边是什么长度的变量。
所以在右边加上强制转换来平衡左右两边是很有必要的。
如果存在常量系数该如何方便的解决呢?
这就可以使用后缀了,常量的后缀类似于强制转换。
后缀U:unsigned
后缀L:long
后缀F:double
比如上面问题中左边是unsigned long int 类型
那么只要右边的系数写成:500ul即可让左边的最长占位达到32BIT,这样右边怎么计算都会按照32位长度来保存了。
实际演示如下:
2655663e9ee7127d0c.png
另外什么长度的数据,鼠标靠近也会在KEIL中显示
8988463e9eeb140aee.png
3792263e9eede800f0.png
那么我们同样可以用一个常量代替强制转换,如下,比如我们给右边的因式前面加上一个1UL参与计算即可。
1843963e9efb515cc7.png 无后缀情况
如果你定义的常量没有采用任何后缀,例如:125,-100,10.1等编译器会怎么理解呢?
编译器会认为是
整数:int
浮点数:double
同样如果你的算式中是计算一个浮点量,那么里面的常量系数建议写成小数形式,即整数后面补充“.0”
例如10写成10.0
另外如果参与的算式有小数的情况下,或者可能参数小数结果的情况下,定义的常量宏应考虑这些例如:
  1. #define K 273.15
  2. #define T0 (25.0+K)
  3. #define R0 10000.0
  4. #define B 3455.0  
另外还药注意一点,常量的类型后缀大小写是等效的。
前缀
同样有时候我们也会用到前缀表示数字进制类型:整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
另外注意一点,C语言中没有2进制数据,所以0B101是非法的,通常如果这么写,编译器会报错:非法8进制数。

现在你学会使用常量后缀完成强制转换了吗?




打赏榜单

21小跑堂 打赏了 20.00 元 2023-02-15
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

C语言中不同位数及不同型号的变量和常亮运算算是较为基础的知识,但是也容易干扰初学者,作者通过举例的方式介绍几种常量计算中容易出错的问题,并详解其中原理,使用知识。  发表于 2023-2-15 13:38
21小跑堂 发表于 2023-2-13 18:16 | 显示全部楼层
距申请原创文章的字数门槛还差一两百字哦,您可以稍加补充。

评论

好,我再补充一些相关的。  发表于 2023-2-13 18:56
 楼主| gaoyang9992006 发表于 2023-2-13 19:15 | 显示全部楼层
21小跑堂 发表于 2023-2-13 18:16
距申请原创文章的字数门槛还差一两百字哦,您可以稍加补充。

又增加了三百多字内容。
小夏天的大西瓜 发表于 2023-2-14 08:59 | 显示全部楼层
整型常数进行类型转换的后缀只有:u或U(unsigned)、l或L(long)、u/U与l/L的组合
 楼主| gaoyang9992006 发表于 2023-2-16 08:39 | 显示全部楼层
小夏天的大西瓜 发表于 2023-2-14 08:59
整型常数进行类型转换的后缀只有:u或U(unsigned)、l或L(long)、u/U与l/L的组合 ...

是的,常量可以使用后缀实现强制转换(告诉编译器该数的存储宽度),对于变量就要使用强制转换确保赋值语句两端类型一致,确保不会丢失位。
mintspring 发表于 2023-2-19 17:43 | 显示全部楼层
以前遇到带U结尾的不知道啥意思,以为十进制呢。
小小蚂蚁举千斤 发表于 2023-2-23 16:30 | 显示全部楼层
进行移位时,常量后缀会影响计算的结果
AdaMaYun 发表于 2023-2-24 13:43 | 显示全部楼层
整型常数的后缀 浮点常数的后缀
OKAKAKO 发表于 2023-2-27 16:08 | 显示全部楼层
常用的常量后缀、格式控制前缀、格式控制符
szt1993 发表于 2023-2-28 11:59 | 显示全部楼层
static_cast 静态类型转换,属于最安全的强制类型转换。

const_cast 在可变与不可变类型之间转换

dynamic_cast 在多态的情况下,父子类之间的转换

reinterpret_cast 所有类型间的转换,最不安全的转换
734774645 发表于 2023-2-28 15:02 | 显示全部楼层
学会这个,可以很好的实现类型转换。
LOVEEVER 发表于 2023-2-28 15:05 | 显示全部楼层
搞懂这个帮助很大,总觉得很好
小小蚂蚁举千斤 发表于 2023-2-28 15:18 | 显示全部楼层
常量的运算之前就不太明白
AloneKaven 发表于 2023-3-1 19:51 | 显示全部楼层
常量可以使用后缀实现强制转换
tpgf 发表于 2023-3-6 16:06 | 显示全部楼层
在 C 语言中,常量后缀可以表明该常数的类型
木木guainv 发表于 2023-3-6 16:27 | 显示全部楼层
gaoyang9992006 发表于 2023-2-16 08:39
是的,常量可以使用后缀实现强制转换(告诉编译器该数的存储宽度),对于变量就要使用强制转换确保赋值语 ...

这个如何告诉编译器呢 需要更改什么配置吗
磨砂 发表于 2023-3-6 17:03 | 显示全部楼层
C语言中常量的默情况:整型默认为有符号int;浮点型默认为double;如果整形常量大小超出int,默认自然就为long int
晓伍 发表于 2023-3-6 17:18 | 显示全部楼层
浮点型常量后缀只有f或F,l或L,没有u或U,因为浮点数一般都为有符号
 楼主| gaoyang9992006 发表于 2023-3-6 22:19 | 显示全部楼层
晓伍 发表于 2023-3-6 17:18
浮点型常量后缀只有f或F,l或L,没有u或U,因为浮点数一般都为有符号

如果是不可组合的互斥符号,系统应该会报错。
八层楼 发表于 2023-3-7 08:05 | 显示全部楼层
请问常亮后缀有强制类型转换的效果吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2053

主题

16410

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部