Java基础 -3.5
我觉得上一篇不是很严谨啊
我认为这个逻辑还是正确的
- 原码、反码、补码:
(1)在Java中,所有数据的表示方式都是以补码形式来表示
如果没有特别的说明,Java 中的数据类型默认为int,int数据类型的长度为4个字节,就是32bit的意思,
(2)正数:原码、反码、补码相同
(3)负数:符号位为1,其余各位是对原码取反,然后整个数加1
(4)~按位取反 会将目标数的补码的各位取反
(5)负数的补码是其绝对值的原码取反,末尾再加1
~正数的流程:
- 首先十进制数会被转化为二进制补码的形式;
- 然后上一步得到的二进制补码的各位取反(~发挥作用);
- 上一步得到的二进制数-1,然后取反,得到目标值(这个目标值是指~正数这个负数)的绝对值的补码;
- 上一步的补码转化为十进制正数,然后+负号,就得到了目标值。
~负数的流程:
- 首先将负数的绝对值转化为二进制补码的形式;
- 将上一步得到的二进制补码的各位取反再+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