今天在看csapp中關於移位操作的處理,上面說邏輯左移和算數左移是等同的,想了想,怎么可能,寫了程序測試了一把,發現確實一樣,但是這個是有前提條件的,在邏輯左移和算數左移的操作數中,如果左移沒有產生有對符號位影響的進位,那么左移都一樣,比如int(4字節),它表示的范圍為范圍[-2^31 , 2^31 -1] 即 [-2147483648,2147483647]。
如果一個數在[-1073741824,1073741823]范圍之內,左移一位,不管是邏輯左移還是算數左移都不會對最高位的符號位產生影響,所以左移一樣,但是左移兩位的話,那么對於int將會產生溢出,此時邏輯左移和算數左移將不一樣。算數左移將產生溢出,而邏輯左移不會有溢出這一概念。
算術左移和算術右移主要用來進行有符號數的倍增、減半;
邏輯左移和邏輯右移主要用來進行無符號數的倍增、減半。
記住這個就可以了。
算術左移和算術左移雖然方式是一樣的,但他們表示的移位后數的范圍是不一樣的,有符號數左移(算術左移)位后的范圍是-128——127【指8位】.而無符號數(算術左移)左移的范圍是0——255.【指8位】
其實不管是哪種移位(上述的),均要考慮移位后的范圍。我們這學期也學微機,剛好學到這,希望對你的理解有所幫助,
#include<stdio.h> int main() { int a=5,b=-5; a=a*2; b=b*2; printf("a=%d,b=%d\n",a,b); a=a<<1; b=b<<1; printf("a=%d,b=%d\n",a,b); a=a>>1; b=b>>1; printf("a=%d,b=%d\n",a,b); a=1073741823,b=-1073741824; a=a<<1; b=b<<1; printf("a=%d,b=%d\n",a,b); return 0; }
