示例代码:
char a = 9;
while(a >= 0)
{
#if (defined __USE_UART_DEBUG) || (defined __USE_RTT_DEBUG)
dbg_printf("a = %d.\r\n", a);
#endif
a--;
delay_ms(20);
}
现象:
从上面的代码中可以推测,程序想要的效果是当变量a--执行10次(9~0)之后就跳出while循环,这段代码乍一看是没有任何问题的,但在keil5上编译会提示warning。
通过打印我们可以看到,变量a会溢出为255(0xFF),并继续执行while(a<=0),程序变成了死循环。
将代码在Sublime Text上运行。
#include <stdio.h>
int main(int argc, char const *argv[])
{
char a = 9;
while(a >= 0)
{
printf("a = %d.\n", a);
a--;
}
return 0;
}
效果跟我们预期的一样
分析:
在ARM内核中char是不支持负数的,因此如果减到0之后并不会变成-1,而是会回到255(0xFF)。想要避免这个问题,可以按照以下方式配置,将char全部按照signed char处理,再重新编译一下工程发现warning没有了。
网友评论