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

相關文章

主站蜘蛛池模板: 亚洲一区二区三区免费在线观看 | 一区二区三区国产精品 | 天天草天天操 | 久久久久久国产精品 | 视频一二三区 | 成年人黄色一级毛片 | 国产色婷婷久久99精品91 | 日本精品一区二区三区在线观看视频 | 三级成人在线观看 | 一级黄a视频 | 国产一级一级 | 欧美一级一区 | 欧美日韩国产一区二区三区不卡 | 日韩精品一区二区三区中文字幕 | 午夜视频在线观看视频 | 毛片免费观看 | 久久精品99久久 | 成人一区二区三区在线观看 | 亚洲在线视频 | 日韩毛片在线视频 | 最近日韩中文字幕 | 日本视频一区二区三区 | 国产综合精品 | 国产不卡在线播放 | 影视一区 | 91精品久久久久久久久中文字幕 | 激情五月婷婷 | 综合久久久久久久 | 国产精品高潮呻吟久久aⅴ码 | 欧美在线成人影院 | 中文成人无字幕乱码精品 | 97精品国产97久久久久久免费 | 久久久精彩视频 | 久久精品超碰 | 看片网站在线 | 欧美黑人一区二区三区 | 色综合99| 中文字幕在线观看国产 | 一区二区三区四区国产精品 | 日韩成人免费 | 亚洲精品一区二区三区四区高清 |