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. 上一步得到的二进制序列转化为十进制就是目标值。
  1. 取反(~)运算

(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

posted @ 2020-02-15 18:21  上杉家主-上杉绘梨衣  阅读(115)  评论(0编辑  收藏  举报