美文网首页
【嵌入式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变量的陷阱

    示例代码: 现象:从上面的代码中可以推测,程序想要的效果是当变量a--执行10次(9~0)之后就跳出while循环...

  • LoadRunner变量、字符串、数组与常用函数

    lr采用c的语法,有区别 • //定义c 变量 :c变量需全部放置前面 • char *p “usrna...

  • 阅读书单

    《嵌入式Linux应用开发完全手册》 《抛弃c程序设计中的谬误与恶习》 《c陷阱与缺陷》 《征服c指针》 《c专家...

  • 基础C语言知识串串香2☞char类型变量种种

    char 类型变量种种 1.使用char类型来执行字符处理 大家应该都知道,C语言设计char类型的目的是存储字母...

  • 1212学习总结

    一、C基本变量及语法 1.c的引入#include int main(int argc,char *argv[])...

  • char类型

    char类型 char类型变量占用1个字节 char类型的数据可以对照ASCII表转换成整型 C语言不看怎么存,只...

  • C语言指针2

    char * string =“I LOVE china”; 在C 语言中 只有字符变量,没有字符串变量。 cha...

  • 如何得到C语言表达式的类型

    C语言允许两个不同整数类型的变量,如char类型变量与int类型变量相加。C语言标准称之为整型提升。那么我们如何通...

  • 第五章 指针与数组

    5.1 指针与地址 指针是保存变量地址的变量。 ANSI C使用void*(指向void的指针)代替 char* ...

  • C基础和面向对象理论基础

    C基础 int float char [] structpointer: 任何变量都可以进行取地址运算(&) 指针...

网友评论

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

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