【嵌入式C】char变量的陷阱

2020-04-03  本文已影响0人  Blue_Well

示例代码:

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。

如果我们忽略这个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没有了。

执行程序,运行就正常
上一篇下一篇

猜你喜欢

热点阅读