今天在測試程式的時候,發現int型的數右移後得到的結果與自己所想要的不一樣,於是查詢原因,最終發現是邏輯右移與算術右移的問題。
系統為32位,以0x80000000(10000000000000000000000000000000)測試。
**:static int shift_test(void)
其輸出結果為:
c0000000, 40000000
比較結果得:
c0000000(11000000000000000000000000000000),移入的位填了1,算術右移;
40000000(01000000000000000000000000000000),移入的位填了0,邏輯右移。
邏輯右移移入的位用0補位,算術右移移入的位用符號位補位。
而邏輯左移與算術左移則相同,補0。
邏輯移位與算術移位的區別
用一句簡單的話來說就是 邏輯移位不需要考慮符號位,算術移位需要考慮符號位,我們都知道。數在計算機中都是以補碼的形式來儲存的,這才造成了邏輯移位和算術移位的的差別。這學期學習的微控制器,看到的變數宣告一直都是unsigned。這才明白了,為什麼要定義為無符號,因為在程式中可能會用到移位運算。看個簡單的...
邏輯移位與算術移位
1.邏輯移位 不論是左移還是右移都是直接補0,所有位參與移位。2.算術移位 與邏輯移位的區別在於符號位不參與移位。當為雙符號位時,只有最高符號位才是真符號位,低符號位會參與移位,而如果移位後為01或10,則說明溢位。如補碼1,010 0000左移一位後為1,100 0000。當機器數為正時 無論左移...
算術移位邏輯移位
unsigned int i 8 int main 請問 上面的變數i是採用邏輯移位還是算術移位呢?邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題。算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變。邏輯移位是指邏輯左移和邏輯...