有两个变量需要存储,因为这两个变量取值范围都很小,是0-4,所以想将两个变量存到一个字节里,第一个变量存放到高字节,第二个变量存放到低字节。 于是写了个表达式,结果运算结果是错的,都是0... adcWriteState = (AdcButton[2*i].curLevel<<4)&0xF0 + AdcButton[2*i+1].curLevel; // adcWriteState = (AdcButton[2*i].curLevel<<4)&0xF0 + AdcButton[2*i+1].curLevel&0x0F; // adcWriteState = (AdcButton[2*i].curLevel<<4)&0xF0; //adcWriteState = AdcButton[2*i+1].curLevel&0x0F; //adcWriteState = (uint8_t)((AdcButton[2*i].curLevel<<4)&0xF0) + (uint8_t)(AdcButton[2*i+1].curLevel&0x0F); AdcButton是自己定义的结构体变量,而curLevel是结构体中的一个变量,类型是uint8_t; 第一个表达式的计算结果,高字节是正确的,低字节永远是0。 第二个表达式是一开始时按自己的思路写的,结果运行后高低字节都是0; 第三个表达式是为了验证问题,只保留高字节部分,结果也没问题; 第四个表达式,只保留低字节部分,结果也没问题。 第五个表达式,两个变量位移位与后,进行类型强制转换,再相加,结果正确。 又试了试高位部分不强制转换,低位部分强制转换,结果出错... |
unsigned char a:4;
unsigned char b:4;
};
使用位域也可以
评分
查看全部评分
加号的运算优先级高于位与。
哈哈,很多人容易犯这样的错误,总以为逻辑运算,移位运算优先级高于加减运算
评分
查看全部评分
评分
查看全部评分
谢谢,第一次见到这种用法。学到了。