<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > C語言中數(shù)據(jù)的左移右移應(yīng)用

          C語言中數(shù)據(jù)的左移右移應(yīng)用

          作者: 時間:2016-11-30 來源:網(wǎng)絡(luò) 收藏
          這兩天在調(diào)試一個比較復(fù)雜的程序,源代碼如下:
          unsigned long Peek(long address )
          {
          unsigned long value;
          //if( address != PokePointer )
          {SetAddress( address );}
          //if( PeekPointer >= PeekLimit )
          //{throw "Peek addressing error!";}

          value += Read_Register( DATA_A ) << 24;
          value += Read_Register( DATA_B ) << 16;
          value += Read_Register( DATA_C ) << 8;
          value +=Read_Register( DATA_D );
          //PeekPointer++; /* maintain local pointer */
          return value;
          }
          Read_Register( DATA_A ) 返回的數(shù)據(jù)都是字節(jié)型的,不知有沒有人能預(yù)言出PPEK()函數(shù)的運行結(jié)果,顯然這個函數(shù)內(nèi)部存在著一個低級的錯誤,因為字節(jié)型的數(shù)據(jù)左移8位所有位將都會變成0!因而PPEK函數(shù)返回的只有Read_Register( DATA_D );那么正確的應(yīng)該是什么樣呢?我的改正如下:
          value += Read_Register( DATA_A );
          value =(value<<8) + Read_Register( DATA_B );
          value =(value<<8) + Read_Register( DATA_C );
          value =(value<<8) + Read_Register( DATA_D );
          或者:
          value +=(unsigned long)Read_Register( DATA_A ) << 24;
          value +=(unsigned long)Read_Register( DATA_B ) << 16;
          value +=(unsigned long)Read_Register( DATA_C ) << 8;
          value +=(unsigned long)Read_Register( DATA_D );
          從以上本人所犯的低級錯誤,我得出一個結(jié)論就是在寫代碼的時候左移右移一定要注意被移數(shù)據(jù)的類型也就是他的位數(shù),是否在操作中會導(dǎo)致數(shù)據(jù)溢出!
          再補充一下:左移<<、右移>>的優(yōu)先級相對于數(shù)學(xué)運算是比較低的,大家看一下下面的表達式:
          c=a<<8+b;//那么這句的意思就是將a左移8+b位然后賦給c
          那么你要實現(xiàn)將a左移8位然后加上b的值賦給c的話就應(yīng)該寫成如下表達式:
          c=(a<<8)+b;
          以上都是本人犯過的低級錯誤,希望看到的能引以為戒?。?!


          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();