關於邏輯左移和算數左移以及邏輯右移和算數右移


今天在看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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM