久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

C語言中數據的左移右移應用

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年06月15日   【字體:

這兩天在調試一個比較復雜的程序,源代碼如下:

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 ) 返回的數據都是字節型的,不知有沒有人能預言出PPEK()函數的運行結果,顯然這個函數內部存在著一個低級的錯誤,因為字節型的數據左移8位所有位將都會變成0!因而PPEK函數返回的只有Read_Register( DATA_D );那么正確的應該是什么樣呢?我的改正如下:
 
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 );
從以上本人所犯的低級錯誤,我得出一個結論就是在寫代碼的時候左移右移一定要注意被移數據的類型也就是他的位數,是否在操作中會導致數據溢出!
再補充一下:左移<<、右移>>的優先級相對于數學運算是比較低的,大家看一下下面的表達式:
c=a<<8+b;//那么這句的意思就是將a左移8+b位然后賦給c
那么你要實現將a左移8位然后加上b的值賦給c的話就應該寫成如下表達式:
c=(a<<8)+b; 
 
以上都是本人犯過的低級錯誤,希望看到的能引以為戒!!!
關閉窗口

相關文章

主站蜘蛛池模板: 精产国产伦理一二三区 | 久久r免费视频 | 户外露出一区二区三区 | 在线成人一区 | 情侣黄网站免费看 | 中文日韩在线视频 | 日韩欧美三级电影在线观看 | 亚洲国产91 | 国产一区二区黑人欧美xxxx | 亚洲人在线观看视频 | 国产日韩欧美综合 | 中文字幕色站 | 亚洲国产中文在线 | 蜜桃精品视频在线 | 国产一区二区三区久久久久久久久 | 欧美一级全黄 | 一级黄色片在线免费观看 | 国产精品视频久久 | 欧美视频xxx | 久久国产视频网 | 色狠狠一区 | 成人免费看黄 | 精品国产乱码久久久久久图片 | 9久久| 免费观看av网站 | 欧美在线一区二区三区 | 国产91久久久久蜜臀青青天草二 | 亚洲视频在线一区 | 欧美在线视频不卡 | 国产在线精品一区二区三区 | 久久99视频免费观看 | av网站免费观看 | 在线天堂免费中文字幕视频 | 日本在线中文 | 国产黄色在线观看 | 国产在线视频三区 | 国产一区二区三区久久久久久久久 | 91精品国产日韩91久久久久久 | 国产精品美女在线观看 | wwww.8888久久爱站网 | 国产高清视频一区 |