Java中的原码、反码和补码

2021-01-20  本文已影响0人  code希必地

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、反码

1111 1111 1111 1111 1111 1111 1111 1110

2.3、补码

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。

上一篇 下一篇

猜你喜欢

热点阅读