新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C語言中數據的左移右移應用

        C語言中數據的左移右移應用

        作者: 時間:2016-11-30 來源:網絡 收藏
        這兩天在調試一個比較復雜的程序,源代碼如下:
        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;
        以上都是本人犯過的低級錯誤,希望看到的能引以為戒!!!


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 铁力市| 饶平县| 鸡东县| 江达县| 谢通门县| 喀喇沁旗| 曲水县| 平山县| 芜湖市| 马龙县| 济南市| 同德县| 库车县| 清涧县| 新源县| 商洛市| 呼图壁县| 平泉县| 陕西省| 屯昌县| 霍山县| 阜城县| 昂仁县| 鲁山县| 文成县| 哈巴河县| 大渡口区| 潜山县| 城步| 即墨市| 若尔盖县| 洮南市| 盐边县| 福海县| 东至县| 鄱阳县| 临潭县| 长白| 滁州市| 余江县| 伊川县|