要明白JAVA负数取反与反码的问题,我们首先需要了解原码、反码、补码的概念。
原码
在Java中,对于整数而言,其原码格式为最高位为符号位,该位上1表示负数而0表示正数,剩余位数为该数字的二进制表示。在这里我们简单用int型的整数3及-3看下例子:
3的原码:00000000 00000000 00000000 00000011
-3的原码: 10000000 00000000 00000000 00000011
因此,对于原码来说,绝对值相等的正数和负数只有符号位不同。
反码
正数的原码即为其反码,对于负数而言只需要将原码除符号位以外的位数取反(如果为0改为1,如果为1改为0),便得到了当前负数的反码。
我们依旧拿数字3举例:
3的反码: 00000000 00000000 00000000 00000011
-3的反码: 11111111 11111111 11111111 11111100
补码
补码
明白了反码的规则,补码的表示方法就很简单了,正数的原码即为其补码,负数的补码是上面取得的反码加1。
3的补码:00000000 00000000 00000000 00000011
-3的补码:11111111 11111111 11111111 11111101
取反
计算机中存储整数都是用的补码,取反运算也是对补码进行取反。我们还是以3与-3为例子。
~3: 11111111 11111111 11111111 11111100
~-3:00000000 00000000 00000000 00000010
- 对于~-3,因为得到的数就是正数,所以原码与反码相同,即为2.
- 对于3,得到的是负数,即此时得到的是一个负数的补码。对改补码-1再求补码即为原码。
原码为:10000000 00000000 00000000 00000100,即为4.
验证代码如下:
public class DataDemo02 {
public static void main(String[] args) {
System.out.println("3的取反为:"+(~3));
System.out.println("-3的取反为:"+(~-3));
}
}
结果为:
3的取反为:-4
-3的取反为:2