zoukankan      html  css  js  c++  java
  • 关于逻辑左移和算数左移以及逻辑右移和算数右移

    今天在看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;
    }
  • 相关阅读:
    JAVA基础知识之JVM-——反射和泛型
    JAVA基础知识之JVM-——动态代理(AOP)
    顶层const和底层const
    C#正则分组实例
    jQuery延迟加载(懒加载)插件 – jquery.lazyload.js
    vs2015打开cshtml文件失败的解决方法
    Postman的使用
    webapi中的Route的标签的命名参数name的使用
    webapi中Route标签定义可选参数
    webapi中的自定义路由约束
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2839075.html
Copyright © 2011-2022 走看看