左移
無論被移動的數是有符號還是無符號,左移一位相當于乘2(在不溢出的情形下)
?
右移
對于無符號數,右移一位相當于除以2;
對于有符號數,如果還想獲得同樣右移除以2的效果,就要考慮算數右移,即符號位始終不變,所有位(包括符號位)都向右移動一位,這樣造成的結果就是,整數通過算數右移,最終都會等于0(所有bit都是0),負數通過算數右移,最終都會等于-1(所有bit都是1)。
?
有符號算數右移與除法
有符號算數右移與對應的除法并不等價,比如,-1 / 2結果為0,但是 -1 >> 1結果仍位-1。其中的差別從匯編碼可以看出來,下面先貼出源碼:
int main() {int a = -1;int b = a / 2;int c = a >> 1; }
對應的匯編碼:
; 1 : int main() {push ebpmov ebp, espsub esp, 12 ; 0000000cH; 2 : int a = -1;mov DWORD PTR _a$[ebp], -1; 3 : int b = a / 2;mov eax, DWORD PTR _a$[ebp]cdq ;將eax的最高bit位復制到edx寄存器sub eax, edxsar eax, 1 ;算數右移指令mov DWORD PTR _b$[ebp], eax; 4 : int c = a >> 1;mov eax, DWORD PTR _a$[ebp]sar eax, 1mov DWORD PTR _c$[ebp], eax; 5 : }
從匯編碼可以看到,-1 / 2和-1 >> 1的匯編碼是不一樣的。