久久久久久久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 | 欧美激情一区二区三区 | 亚洲激情偷拍 | 亚洲综合网站 | 欧美日韩一区二区在线 | 日韩精品国产精品 | 国产成人精品一区二区三区视频 | av女人天堂| 天天草天天射 | 国产精品福利在线观看 | 国产浮力第一页 | 天天爽夜夜爽夜夜爽 | 亚洲精品成a人在线观看 | 色婷婷狠狠 | 人人干人人看 | 精品国产欧美一区二区三区成人 | 操女人网站 | 午夜免费在线 | 久久精品国产亚洲 | 一级黄色在线观看 | 亚洲国产一区二区三区 | 国精产品一区二区 | 一区二区小视频 | 三级在线视频 | 激情高潮到大叫狂喷水 | 日韩精品一区二区三区免费视频 | 丁香婷婷在线 | 大色av | 91久久国产综合久久91精品网站 | www.国产精品 | 性欧美69| 久久免费看片 | 久久这里都是精品 | 一区二区免费看 | 亚洲人成免费 | 在线不欧美 | 久久久久国产视频 | 一区二区三区不卡视频 | av大全在线观看 | 日本三级在线视频 | 国产这里只有精品 |