新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > C語言中數(shù)據(jù)的左移右移應用

C語言中數(shù)據(jù)的左移右移應用

作者: 時間:2016-11-30 來源:網(wǎng)絡 收藏
這兩天在調(diào)試一個比較復雜的程序,源代碼如下:
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 ) 返回的數(shù)據(jù)都是字節(jié)型的,不知有沒有人能預言出PPEK()函數(shù)的運行結(jié)果,顯然這個函數(shù)內(nèi)部存在著一個低級的錯誤,因為字節(jié)型的數(shù)據(jù)左移8位所有位將都會變成0!因而PPEK函數(shù)返回的只有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 );
從以上本人所犯的低級錯誤,我得出一個結(jié)論就是在寫代碼的時候左移右移一定要注意被移數(shù)據(jù)的類型也就是他的位數(shù),是否在操作中會導致數(shù)據(jù)溢出!
再補充一下:左移<<、右移>>的優(yōu)先級相對于數(shù)學運算是比較低的,大家看一下下面的表達式:
c=a<<8+b;//那么這句的意思就是將a左移8+b位然后賦給c
那么你要實現(xiàn)將a左移8位然后加上b的值賦給c的話就應該寫成如下表達式:
c=(a<<8)+b;
以上都是本人犯過的低級錯誤,希望看到的能引以為戒?。。?/div>

評論


技術(shù)專區(qū)

關(guān)閉