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