Java中正负数的存储方式-正码 反码和补码

正码

我们以int 为例,一个int占用4个byte,32bits

0 存在内存上为
00000000 00000000 00000000 00000000

11 存在内存上为
00000000 00000000 00000000 00001011

反码

逐位取反,就得到一个对应的反码

以11为例

正码: 00000000 00000000 00000000 00001011

反码: 11111111 11111111 11111111 11110100

补码

在补码的基础上再加1,就可以得到补码。

同样以11为例

正码: 00000000 00000000 00000000 00001011

反码: 11111111 11111111 11111111 11110100

补码: 11111111 11111111 11111111 11110101

此时候就可得到-11在内存上的表示方式(11111111 11111111 11111111 11110101)

如果要知道某个二进制的负数实际上是多少(最高位为1)

以0xFFFFFFFF为例子

补码: 11111111 11111111 11111111 11111111

反码: 11111111 11111111 11111111 11111110

正码: 00000000 00000000 00000000 00000001

正码为1,所以0xFFFFFFFF (11111111 11111111 11111111 11111111)表示-1.

这么做的原因

这是因为底层硬件对数据做运算的时候,只有加数器可用,也就是只能直接把数据拿来相加,通过将负数用这种方式来表达,就可以直接通过对二进制码相加实现对数据的加减运算。

以 -11+5 为例子

-11: 11111111 11111111 11111111 11110101

+5 : 00000000 00000000 00000000 00000101

-6 : 11111111 11111111 11111111 11111010

反码: 11111111 11111111 11111111 11111001

正码: 00000000 00000000 00000000 00000110

05-11 03:04