zoukankan      html  css  js  c++  java
  • C语言优先级在嵌入式编程中的重要性

    C语言优先级在嵌入式编程中的重要性

    最近在弄PIC的一个小项目,之前是前一个同事在原有程序的基础上经行了代码的优化,同时添加了一点新的功能,由于PIC单片机的容量还是相对较小,所以不得不把众多的ADC转换的函数整合到一个函数里,同时又有8位和10位的AD转换功能。

    在程序里需要用到C语言里的位运算,PIC16F87x单片机的AD转换默认是10位的,而pic单片机是8位单片机,所以需要两个8位寄存器来存储AD转换的值,并通过ADFM位来设置其左对齐还是右对齐,然后在程序里读取AD转换后的值,读取数值的时候,就要用到位移的运算:

    Ret_val=((ADRESH&0x03)<<8) +ADRESL;  当然这个是正确的,我这里加了括号,完全没问题,Ret_val是unsigned int类型的,可是之前的同时是这样写的:((ADRESH&0x03)<<8 +ADRESL);貌似没错啊,可是在C语言里“+”的运算符比“<<”的优先级高,所以他会先进行ADRESH&0x03,而后在8+ADRESL,最后在(ADRESH&0x03)<<(8 +ADRESL),和我们设想的完全不同了,从而到时读到的值就是错误的,害得我弄了两个晚上,幸好我留意了这个语句。

    总结:在C语言里,倘若程序员很清楚的知道运算符的优先级,这个自然好,但是如果有点模糊,那就很有可能要出错了,那就去看看C语言书,最保险的是加上括弧,那样也是没有问题的。记住:在嵌入式里位运算运用的还是很广泛的,所以切记切记!~

  • 相关阅读:
    一些对数学领域及数学研究的个人看法(转载自博士论坛wcboy)
    dynamic与var
    转载-V.I.Arnold, beyond a mathematician
    转载---青年问禅师
    转载-傅里叶级数的几何意义 – 巧妙记忆公式的方法
    转载--柯尔莫哥洛夫
    转载--黎曼
    动态规划复习
    几匹单调队列水题
    fastIO
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007521.html
Copyright © 2011-2022 走看看