Java中负整数的二进制表示

Pet*_*ila 2 java

请帮助我理解负整数的二进制表示.

例如我们有5.二进制表示5 00000000.00000000.00000000.00000101.

而且据我所知,-5的二进制表示应该是这样的10000000.00000000.00000000.00000101.

但是输出是11111111.11111111.11111111.11111011.

我有2个问题:

1)为什么这里有这么1多位.

2)我真正无法理解最后3位011.看起来像3.即使是+1或-1,它也将是100010

谢谢

pax*_*blo 16

您对这些负数应该是什么样子的理解是有缺陷的.Java对负数使用二进制补码,基本规则是取正数,反转所有位然后加一.那让你变得消极.

因此,正如你所说:

0000...00000101
Run Code Online (Sandbox Code Playgroud)

倒置会给你:

1111...11111010
Run Code Online (Sandbox Code Playgroud)

然后添加一个给出:

1111...11111011
Run Code Online (Sandbox Code Playgroud)

显示的位模式-5是所谓的符号/幅度,您可以通过翻转最左边的位来否定数字.这在C实现中被允许作为三种可能性中的一种,但Java仅使用二进制补码(对于其负整数).


das*_*ght 7

据我了解 -5 的二进制表示应该类似于10000000.00000000.00000000.00000101.

如果 Java 使用整数的符号和大小表示,那就正确了。然而,Java 使用二进制补码表示法,因此其余位将根据该表示法的规则进行更改。

二进制补码表示背后的想法是,当您将这种表示形式中的数字添加到另一个值并删除最高有效端的额外位时,结果就像减去相同大小的正数一样。

您可以用十进制数字来说明这一点。在两位数表示中,99 的值类似于 -1,98 类似于 -2,97 类似于 -3,依此类推。例如,如果删除 中的最高位数字23 + 99 = [1]22,则 99 的行为类似于 -1。23 + 98 = [1]21,所以 98 的表现就像 -2。

这与二进制数的补码表示方式相同,只是您会在顶部删除额外的位。