C语言中的运算符优先级

发布时间 2023-12-10 21:30:16作者: HAOstudio

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;