Java基础 -3.5

我觉得上一篇不是很严谨啊
我认为这个逻辑还是正确的

  1. 原码、反码、补码:
    (1)在Java中,所有数据的表示方式都是以补码形式来表示
    如果没有特别的说明,Java 中的数据类型默认为int,int数据类型的长度为4个字节,就是32bit的意思,
    (2)正数:原码、反码、补码相同
    (3)负数:符号位为1,其余各位是对原码取反,然后整个数加1
    (4)~按位取反 会将目标数的补码的各位取反
    (5)负数的补码是其绝对值的原码取反,末尾再加1

    ~正数的流程:
    1. 首先十进制数会被转化为二进制补码的形式;
    2. 然后上一步得到的二进制补码的各位取反(~发挥作用);
    3. 上一步得到的二进制数-1,然后取反,得到目标值(这个目标值是指~正数这个负数)的绝对值的补码;
    4. 上一步的补码转化为十进制正数,然后+负号,就得到了目标值。
    ~负数的流程:
    1. 首先将负数的绝对值转化为二进制补码的形式;
    2. 将上一步得到的二进制补码的各位取反再+1,得到负数的二进制补码;
    3. 将上一步得到的负数的二进制补码的各位取反(~发挥作用);
    4. 上一步得到的二进制序列转化为十进制就是目标值。
  2. 取反(~)运算

(1)n=37 ,二进制数就是 100101
原码/补码/反码:00000000 00000000 00000000 00100101 =37

~n(对n的补码) 取反运算得:  11111111 11111111 11111111 11011010 
很明显,最高位是1,意思是取反后的数字为负数,负数的补码是其绝对值的原码取反,末尾再加1,因此,我们可将这个二进制数的补码进行还原:
首先,末尾减1得反码:11111111 11111111 11111111 11011001
其次,将各位取反得原码:00000000 00000000 00000000 00100110   这个就是~n的绝对值形式,|~n|=38   ,

所以,~n=-38,这个就是Java虚拟机的运算结果

(2)n= - 4, 取反 (~-4)。注意:Java中,所有数据的表示方式都是以补码形式

原码:10000000 00000000 00000000 00000100

反码:11111111 11111111 11111111 11111011

补码:11111111 11111111 11111111 11111100

对补码取反:00000000 00000000 00000000 00000011  

因为是正数,所以补码等于原码等于反码= 3,所以~-4 = 3

public class zzz {
    public static void main(String[] args) {
        int i =-4;
        //原码 1000 0000 0000 0000 0000 0000 0000 0100
        //反码 1111 1111 1111 1111 1111 1111 1111 1011
        //补码 1111 1111 1111 1111 1111 1111 1111 1100
        //对补码求反
        //    0000 0000 0000 0000 0000 0000 0000 0011
        //3
        System.out.println(~i);

    }
}
>>> 3

public class zzz {
    public static void main(String[] args) {
        int i =37;
        //原码 0000 0000 0000 0000 0000 0000 0010 0101
        //反码 0000 0000 0000 0000 0000 0000 0010 0101
        //补码 0000 0000 0000 0000 0000 0000 0010 0101
        //对补码求反
        //    1111 1111 1111 1111 1111 1111 1101 1010
        //-1
        //    1111 1111 1111 1111 1111 1111 1101 1001
        //取反
        //    0000 0000 0000 0000 0000 0000 0010 0110
        //32+4+2= 38
        //加负号
        // -38
        System.out.println(~i);

    }
}
>>> -38

猜你喜欢

转载自www.cnblogs.com/sakura579/p/12313040.html
3.5