1、实例
先来看个例子
public static void main(String[] args) {
System.out.println(~2);
}
~
在Java中是按位取反的意思,2是整形占4字节,其二进制表示为:
0000 0000 0000 0000 0000 0000 0000 0010
按位取反后的结果为:
1111 1111 1111 1111 1111 1111 1111 1101
但是输出结果却是-3。
2、原码、反码、补码
Java中存储的是有符号的数,在计算机中有符号的数是以补码的形式存储的。
2.1、原码
原码的二进制表示:最高位是符号位(1表示负数,0表示整数),其余位表示值的大小。
1和-1的原码表示为
1000 0000 0000 0000 0000 0000 0000 0001 //-1的原码
0000 0000 0000 0000 0000 0000 0000 0001 //1的原码
2.2、反码
- 正数的反码是其本身
-
负数的反码:符号位不变,其余位按位取反。
-1的反码为
1111 1111 1111 1111 1111 1111 1111 1110
2.3、补码
- 正数的补码是其本身
-
负数的补码:在反码的基础上
加1
-1的补码为
1111 1111 1111 1111 1111 1111 1111 1111
3、分析
回到最初的问题:2在计算机中是以补码的形式存储的,由于正数的补码是其本身,所以2的补码为
0000 0000 0000 0000 0000 0000 0000 0010
~2
表示按位取反,则对2的补码进行按位取反,结果为
1111 1111 1111 1111 1111 1111 1111 1101
从取反后的补码可知是负数,而负数转二进制规律:
1、取负数的绝对值的原码;
2、计算原码的反码;
3、对反码加一,获取补码。
我们可以反推出该负数绝对值的原码:
1、对补码减一,获取反码:1111 1111 1111 1111 1111 1111 1111 1100
2、将其按位取反获取原码:0000 0000 0000 0000 0000 0000 0000 0011
3、可知这个原码表示的是正数3,所以~2等于-3。
网友评论