关于逻辑左移和算数左移以及逻辑右移和算数右移

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

 

posted @ 2012-12-29 16:55  GOD_YCA  阅读(10317)  评论(0编辑  收藏  举报