久久久久久久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; 
 
以上都是本人犯過的低級錯誤,希望看到的能引以為戒!!!
關閉窗口

相關文章

主站蜘蛛池模板: 成人精品一区二区三区 | 天天操网 | 国产婷婷精品av在线 | 国内精品伊人久久久久网站 | 日日操操 | 一区二区三区视频在线免费观看 | 性一交一乱一透一a级 | 美日韩中文字幕 | 国产无人区一区二区三区 | 手机在线观看av | 国产成人免费一区二区60岁 | 麻豆成人在线视频 | 91欧美 | 丁香婷婷成人 | 99久久久久久99国产精品免 | 亚洲www| 亚洲一区二区三区在线 | 欧美精品福利视频 | 久久成人18免费网站 | 欧美一级视频 | 日韩视频一区二区三区 | 日韩男人天堂 | 在线视频一区二区 | 一级免费看片 | 男女羞羞视频在线观看 | 精品视频一区二区三区四区 | 免费成人高清在线视频 | 亚洲一区视频 | 性欧美xxxx| 国产一区二区欧美 | 亚洲一区二区三区四区五区中文 | 午夜一区 | av在线天堂| 在线视频91 | 欧美激情精品久久久久久 | 男人的天堂久久 | 中文字幕国产 | 国产剧情一区 | 亚洲一区二区中文字幕 | 夜夜爽99久久国产综合精品女不卡 | xx性欧美肥妇精品久久久久久 |