在调试STM32 IAR开发环境的时候碰到如下问题,宏定义
#define SDA_IN() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=8<<28;} (此行提示警告)
#define SDA_OUT() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=3<<28;} (此行没有提示警告)
编译结果总是提示警告,针对上面红色的宏定义。
Warning[Pe068]: integer conversion resulted in a change of sign (整数转换导致符号变化)
============================================================
实际上那个GPIOB->CRL是32位的寄存器,数值没有溢出啊。
后来google一下,有个网友的意见说,左移就是乘法,是有符号整数计算的。
8<<28的值,如果按照有符号乘法已经溢出了,如果是无符号的话就没有问题了。
下面的一个条宏定义3<<28即使按照有符号乘法也没有溢出,所以它没有提示警告。
解决方法强制类型转换,将有符号的转变为无符号的。
#define SDA_IN() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=3<<28;} (此行没有提示警告)
其实如果不管这个警告,程序运行也是正确的,但是我们在调试程序的时候还要多解决一些警告问题,不然代码总是有点缺陷的。