51单片机在处理32bit的数要特别注意:
下面代码咋一看regmask当作32bit数进行操作,没什么问题。
c
unsigned long regmask = 0;
regmask = ~((1<<startbit) -1);
regmask &= ((1<<endbit) -1)|(1<<endbit);
RegValue &= regmask;
在51的IDE中这么写,会把移位的1当作16bit的数来操作,导致结果和预想不一致。
正确的写法是在1前面加UL
c
unsigned long regmask = 0;
regmask = ~((1UL<<startbit) -1);
regmask &= ((1UL<<endbit) -1)|(1UL<<endbit);
RegValue &= regmask;
还有,51单片机的float和double是一样的,这个也要特别注意一下。
说完了运算,再说说printf
大家都知道
c
%d: 十进制整数
%u: 无符号整数
%f: 浮点数
%s: 字符串
%c: 单个字符
%x, %X: 十六进制整数
对于unsigned long,需要使用%lu,对于限定精度的浮点数需要加入数字限定%.1f