zoukankan      html  css  js  c++  java
  • 强制类型转换的重要性

        在做ISD4004语音芯片驱动程序时,欲读取录音或者放音的地址,编了一段程序如下所示。但是,程序一直执行错误。

    /***************************************************************
    函数功能:SPI串行发送24位命令并同时接收24位数据的函数,接收的8位数
              据高位低位反向(*|*|*|*|*|P16|···P1|P0|EOM|OVF|0|0|0|0|0|0|0|0)
    ****************************************************************/
    unsigned long spi_24bit_tr(unsigned char isd_cmd,unsigned char address_h,unsigned char address_l)
    {
    unsigned long isd_txd = 0;
    unsigned long isd_rxd = 0;
    unsigned char count;
        isd_txd = ((isd_cmd<<16)|(address_h<<8)|(address_l));
        SS = 0;
        for(count=0;count<24;count++) {
            isd_rxd = isd_rxd >> 1;     
            MISO = 1;
            if (MISO){
                isd_rxd = isd_rxd | 0x80000000;
            }  
            if (isd_txd & 0x01){        
                MOSI = 1;
            }
            else{
                MOSI = 0;
            }
            isd_txd = isd_txd >> 1;         
            SCLK = 1;
            _nop_();
             SCLK = 0;
            _nop_();
        }              
        SS = 1;      
    return isd_rxd;     
    }

    (一)在keil中关于红色那行进行了测试

    测试结果如下:

    可以看到,isd_txd并不是我们想要的结果,isd_cmd<<16这部分丢失了,强制类型转换后,就得到了理想的效果。

    (二)在vc6.0上重新做上边的实验

    没有强制类型转换的测试效果

    加上强制类型转换的效果

    结论:

    1.强制类型转换对于程序的可靠性是必须的,而且对于程序的可读性也是有益的;不要把希望寄托于编译器来完成类型转换

    2.不同的编译器对不同类型数据默认的转换处理是不一样的,例如本文涉及的keil和vc6.0。

  • 相关阅读:
    ionic2 开始第一个App(二)
    简单的文件下载方法
    php获取汉字首字母
    LumiSoft.Net邮件接收乱码问题解决
    输入框字符限制插件·
    微软相关产品集合的网站,感觉找软件很方便 也很全 收藏了
    利用发射 下拉列表绑定枚举
    ASP.NET中UpdatePanel内控件的JS失效的问题
    Json格式转string
    SQL 判断是否存在时间交叉
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/3418473.html
Copyright © 2011-2022 走看看