zoukankan      html  css  js  c++  java
  • 内存中的数表示

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

    十进制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即可。
    不怕万人阻挡,只怕自己投降。
  • 相关阅读:
    xtrabackup
    spark对机器的要求
    hbase的总结
    TO B公司高效能的组织建设实践
    如何给客户展示实力
    什么样的IT队伍是好队伍
    程序员如何使用OKR
    云原生
    Flink 的18个小知识点
    apt 常用命令
  • 原文地址:https://www.cnblogs.com/newstartCY/p/11598182.html
Copyright © 2011-2022 走看看