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

相關文章

主站蜘蛛池模板: 一区二区中文 | 日韩精品999 | 亚洲入口| 日韩免费视频一区二区 | 涩涩视频网站在线观看 | 午夜伦理影院 | 狠狠干美女 | 国产高清亚洲 | 本道综合精品 | 久久久久国 | 欧美特级黄色 | 日韩一区二区在线免费观看 | 欧美综合视频 | 国产不卡在线观看 | 91porn成人精品 | 欧美日韩亚洲国产综合 | 久久久久99| 中文在线一区二区 | 国产成人午夜精品影院游乐网 | 区一区二在线观看 | 色综合久久久久 | 大吊一区二区 | 日韩二区| 国产欧美二区 | 国精品一区 | 我我色综合 | 一级毛片视频在线 | 古典武侠第一页久久777 | 日本视频一区二区三区 | 日韩午夜| 日韩欧美亚洲一区 | 国产一区二区三区久久久久久久久 | 亚洲精品视频在线观看视频 | 午夜免费在线观看 | 久久成人免费视频 | 亚洲精品福利视频 | 在线免费观看毛片 | 成人精品 | 一a一片一级一片啪啪 | 九九热在线视频观看这里只有精品 | 亚洲欧洲精品成人久久奇米网 |