内存中的数表示

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

十进制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即可。
不怕万人阻挡,只怕自己投降。
原文地址:https://www.cnblogs.com/newstartCY/p/11598182.html