单片机C语言易错知识点

玩转单片机 2019-04-11 13:58

在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点,是一些小细节。但是正是因为很基础,又都是小细节,所以我们往往容易忽视它们。结果有时候我们会花很长的时间纠结一个问题,迟迟找不到问题的所在。当发现原因竟然是这么的简单和不起眼时,我想不单是我,大家都会感到痛不欲生。笔者今天又碰到了这样的问题,实在忍不住了。因为这些问题都是小的知识点,考虑到之前也遇到好多这种问题,于是决定每次遇到问题就记录下来,时刻提醒自己。
1. !和 ~ 不一样
!
 是逻辑非符号,~ 是位取反符号。
对IO口某个管脚赋值时不要错用 !,如


2.<<和>>的优先级低于+、-
比如要实现c=x*2+1,没有加括号会出错


3.移位要防止溢出
其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法来进行优化。
不过有时候却会出现问题,比如溢出问题。当很明显可能溢出的话我们是会注意的,比如


4.无符号数和有符号数混合运算都会被强制转换为无符号数运算
当一个有符号数和一个无符号数进行算术运算时,系统会自动将有符号数强制转换为无符号数再进行运算(即使你使用有符号数强制类型转换),如下面两种写法的运输结果是一样的


5.局部变量要初始化
局部变量没有初始化的话,因为单片机每次为他分配的是同一个内存区域,当你在函数中是这么使用局部变量时,就可能出问题:


如果第一次调用fun时,a传递的值为0,那么flag = 0x01;执行if(flag&0x01)后面的代码。以后再调用fun时,即使a不为0,但flag依然使用之前的内存区域,所以其值一直为0x01,一直执行的是if后面的代码,而不是else后面的。
如果要避免这个错误,平时要养成对局部变量初始化的习惯。


玩转单片机 专注电子工程师行业技术知识分享,特别是硬件电子、单片机以及嵌入式FPGA等多方面的经典知识总结!是一个带您从电子菜鸟修炼成一个高手的知识传播者!
评论
wjx943_53627304 2019-04-25 21:27
喜欢看技术贴
热门推荐
相关推荐
我要评论
1
4
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦