C语言中的运算符优先级
前言
这几天在调试一个程序,遇到了一个bug,就是需要读取寄存器的数据。该数据是一个16bit的数据,按照高8位一个byte和低8位一个byte分别存放在了不同的寄存器地址中。但是在我读取数据的时候,总是会出现数据不符合预期的情况。
在程序中是这样子的,读取的高8位数据存在了msb
变量中,读取的低8位数据存在了lsb
变量中:
//错误程序
uint8_t lsb, msb;
uint16_t mdata = msb<<8 + lsb;
直到我检查了好久程序,突然注意到了运算符优先级的问题。
将程序改为如下后,程序运行正常:
//正确程序
uint8_t lsb, msb;
uint16_t mdata = (msb<<8) + lsb;
重点:
加减运算符比移位运算符的优先级要高,所以在运行msb<<8 + lsb
时,是将msb右移8+lsb个位;而在运行(msb<<8) + lsb
时,是将msb右移8位,然后与lsb相加。
C语言运算符优先级
这不得不又让我复习了一遍C语言的运算符优先级顺序。
在下图中,优先级数字越小,说明该运算符的优先级越高:
最后,程序的另外一种正确写法:
//正确程序
uint8_t lsb, msb;
// uint16_t mdata = (msb<<8) + lsb;
uint16_t mdata = msb<<8 | lsb;
标签:lsb,程序,C语言,运算符,优先级,msb
From: https://www.cnblogs.com/haostudio/p/17893265.html