下面討論整數的移位問題,包括有符號整數和無符號整數的左移和右移,其他情況可作參考。
邏輯移位:
邏輯左移:向左移位時將左邊移出的高位丟棄,將右邊空出的低位補0
邏輯右移:向右移位時將右邊移出的低位丟棄,將左邊空出的高位補0
算數移位:
算數左移:向左移位時將左邊移出的高位丟棄,將右邊空出的低位補0
算數右移:向右移位時將右邊移出的低位丟棄,將左邊空出的高位補0,最高位上保留符號位
#include
"stdio.h"
intmain()
輸出為:
positive_sleft =
20negative_sleft =-20
unsigned_sleft =
20positive_sright =
5negative_sright =-5
unsigned_sright =
5請按任意鍵繼續.
..
彙編指令中,
shl:邏輯左移,
shr:邏輯右移,
sal:算術左移,
sar:算術右移,
上述原始碼的彙編**為
#include
"stdio.h"
intmain()
000814c7 pop edi
000814c8 pop esi
000814c9 pop ebx
000814ca add esp,
12ch
000814d0 cmp ebp,esp
000814d2 call __rtc_checkesp (
081136h)
000814d7 mov esp,ebp
000814d9 pop ebp
000814da ret
左移:有符號整數和無符號整數的左移都是邏輯左移
右移:有符號整數的右移是算數右移,無符號整數的右移是邏輯右移
有符號整數:左移是邏輯移位,右移是算數移位
無符號整數:左移和右移都是邏輯移位
左移:邏輯
右移:有符號:算數,無符號:邏輯
算數移位 , 與邏輯移位
是算數移位,也就是 1,如果右移,則 最高位補1 左移,則右邊補0 但是uint32 t的10 00 00 00 右邊移動後,是什麼?補0唄,因為大於0 所以所有的位移操作都最好定義為unsigned data 什麼叫邏輯移位和算術移位 1 算術移位 當乘數或除數是2n時,算術移位用來快速地完成對整...
算術移位和邏輯移位
算術移位和邏輯移位 unsigned int i 8 int main 上面的變數i是採用邏輯移位還是算術移位呢?邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題 算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變 但我們好奇的...
算術移位和邏輯移位
算術移位和邏輯移位 unsigned int i 8 int main 上面的變數i是採用邏輯移位還是算術移位呢?邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題 算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變 但我們好奇的...