• 内存中的数表示


    按位非运算符是~,作用是将每位二进制取反

    十进制2的二进制表示为:

    0000,0010

    每位都取反:

    1111,1101

    这是内存中的保存形式。

    我们读取的十进制是根据原码来读取,而在内存中,数值都是以二进制补码形式保存的。

    正数的补码和原码一样,负数的原码转补码或者补码转原码的规则:
    符号位不变,将剩余位取反,得到反码,在反码的基础上最后一位加一得到负数的补码。

    1111,1101输出10进制的过程:

      1. 符号位不变,剩余位取反
          1000,0010
      2. 最后一位加1
          1000,0011
      3. 得的结果1000,0011就是-3的原码形式
        对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:
        
                对于负数的右移:因为负数在内存中是以补码形式存在的,所有首先根据负数的原码求出负数的补码(符号位不变,其余位按照原码取反加1),然后保证符号位不变,其余位向右移动到X位,在移动的过程中,高位补1.等移位完成以后,然后保持符号位不变,其余按位取反加1,得到移位后所对应数的原码。即为所求。
        
               举例1:
        
                           -100带符号右移4位。
        
                           -100原码:   10000000    00000000    00000000   01100100
        
                           -100补码:    保证符号位不变,其余位置取反加1
        
                                                 11111111    11111111    11111111   10011100
        
                           右移4位   :   在高位补1
        
                                                 11111111    11111111    11111111    11111001
        
                                         补码形式的移位完成后,结果不是移位后的结果,要根据补码写出原码才是我们所求的结果。其方法如下:
        
                            保留符号位,然后按位取反
        
                                                 10000000    00000000    00000000     00000110
        
                            然后加1,即为所求数的原码:
        
                                                           10000000    00000000    00000000    00000111
        
                                 所有结果为:-7
        
                          举例2:
        
                                    -100无符号右移4位。
        
                           -100原码:   10000000    00000000    00000000   01100100
        
                           -100补码:    保证符号位不变,其余位置取反加1
        
                                                 11111111    11111111    11111111   10011100
        
                           无符号右移4位   :   在高位补0
        
                                                 00001111    11111111    11111111    11111001
        
                          即为所求:268435449
        
                         
        
         
        
        总结:正数的左移与右移,负数的无符号右移,就是相应的补码移位所得,在高位补0即可。
        
                  负数的右移,就是补码高位补1,然后按位取反加1即可。
    不怕万人阻挡,只怕自己投降。
  • 相关阅读:
    java 泛型 -- 泛型类,泛型接口,泛型方法
    android:id="@id/resid" , andorid:id="@+id/resid" 的区别
    Ubuntu16.04 + Win 10 双系统 时间同步,启动项顺序,NumLock指示灯常亮
    Linux 下 Console / 控制台 复制粘贴快捷键
    Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid、andBase、KJFrameForAndroid、SmartAndroid、dhroid..
    JQuery的Ajax跨域请求的
    1031. Hello World for U (20)
    项目进阶 之 集群环境搭建(三)多管理节点MySQL集群
    Tomcatserverhttps协议配置简单介绍
    Unity3D
  • 原文地址:https://www.cnblogs.com/newstartCY/p/11598182.html
Copyright © 2020-2023  润新知