美文网首页
【嵌入式C】char变量的陷阱

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

作者: Blue_Well | 来源:发表于2020-04-03 23:29 被阅读0次

    示例代码:

    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没有了。

    执行程序,运行就正常

    相关文章

      网友评论

          本文标题:【嵌入式C】char变量的陷阱

          本文链接:https://www.haomeiwen.com/subject/tfolphtx.html