发新帖本帖赏金 20.00元(功能说明)我要提问
12下一页
返回列表
打印
[牛人杂谈]

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

[复制链接]
1689|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 gaoyang9992006 于 2023-2-13 19:15 编辑

#申请原创#@21小跑堂 [/url]
在嵌入式开发中,我们通常是使用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进制数。

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




使用特权

评论回复

打赏榜单

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

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

使用特权

评论回复
评论
gaoyang9992006 2023-2-13 18:56 回复TA
好,我再补充一些相关的。 
板凳
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的组合

使用特权

评论回复
5
gaoyang9992006|  楼主 | 2023-2-16 08:39 | 只看该作者
小夏天的大西瓜 发表于 2023-2-14 08:59
整型常数进行类型转换的后缀只有:u或U(unsigned)、l或L(long)、u/U与l/L的组合 ...

是的,常量可以使用后缀实现强制转换(告诉编译器该数的存储宽度),对于变量就要使用强制转换确保赋值语句两端类型一致,确保不会丢失位。

使用特权

评论回复
6
mintspring| | 2023-2-19 17:43 | 只看该作者
以前遇到带U结尾的不知道啥意思,以为十进制呢。

使用特权

评论回复
7
小小蚂蚁举千斤| | 2023-2-23 16:30 | 只看该作者
进行移位时,常量后缀会影响计算的结果

使用特权

评论回复
8
AdaMaYun| | 2023-2-24 13:43 | 只看该作者
整型常数的后缀 浮点常数的后缀

使用特权

评论回复
9
OKAKAKO| | 2023-2-27 16:08 | 只看该作者
常用的常量后缀、格式控制前缀、格式控制符

使用特权

评论回复
10
szt1993| | 2023-2-28 11:59 | 只看该作者
static_cast 静态类型转换,属于最安全的强制类型转换。

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

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

reinterpret_cast 所有类型间的转换,最不安全的转换

使用特权

评论回复
11
734774645| | 2023-2-28 15:02 | 只看该作者
学会这个,可以很好的实现类型转换。

使用特权

评论回复
12
LOVEEVER| | 2023-2-28 15:05 | 只看该作者
搞懂这个帮助很大,总觉得很好

使用特权

评论回复
13
小小蚂蚁举千斤| | 2023-2-28 15:18 | 只看该作者
常量的运算之前就不太明白

使用特权

评论回复
14
AloneKaven| | 2023-3-1 19:51 | 只看该作者
常量可以使用后缀实现强制转换

使用特权

评论回复
15
tpgf| | 2023-3-6 16:06 | 只看该作者
在 C 语言中,常量后缀可以表明该常数的类型

使用特权

评论回复
16
木木guainv| | 2023-3-6 16:27 | 只看该作者
gaoyang9992006 发表于 2023-2-16 08:39
是的,常量可以使用后缀实现强制转换(告诉编译器该数的存储宽度),对于变量就要使用强制转换确保赋值语 ...

这个如何告诉编译器呢 需要更改什么配置吗

使用特权

评论回复
17
磨砂| | 2023-3-6 17:03 | 只看该作者
C语言中常量的默情况:整型默认为有符号int;浮点型默认为double;如果整形常量大小超出int,默认自然就为long int

使用特权

评论回复
18
晓伍| | 2023-3-6 17:18 | 只看该作者
浮点型常量后缀只有f或F,l或L,没有u或U,因为浮点数一般都为有符号

使用特权

评论回复
19
gaoyang9992006|  楼主 | 2023-3-6 22:19 | 只看该作者
晓伍 发表于 2023-3-6 17:18
浮点型常量后缀只有f或F,l或L,没有u或U,因为浮点数一般都为有符号

如果是不可组合的互斥符号,系统应该会报错。

使用特权

评论回复
20
八层楼| | 2023-3-7 08:05 | 只看该作者
请问常亮后缀有强制类型转换的效果吗

使用特权

评论回复
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1954

主题

15896

帖子

207

粉丝