了解两者的补充

软件工程 2025-08-21

您是否曾经想过为什么在Java和其他语言中,一个字节只能将(2^7 )表示为(2^7-1 )为最大值,为什么我们不能拥有(2^7 )。确实有一个原因,在Java中,有些原始类型(INT,短,长,字节)被签署了两人的补充。在本文中,我们将学习如何使用两者的补充来表示二进制表示中的正数和负小数点。

鉴于一个正数,两个的补充是将该数字扭转为负数的操作,而最重要的位(最左)表示该数字是正数还是负数(0表示正值,1表示负数)。例如,我有数字7,想找到其负面的二进制表示,即-7。这是一般过程(为了减少详细信息,我们只使用4位来表示我们的二进制编号):

  • 获取数字7 => (0111_2 )的二进制表示形式

  • 翻转所有位(0变为1和1变为0)=> (1000_2 )

  • 将1添加到翻转值=> (1001_2 )

这就是您以其二进制形式获得数字-7的方式。一路上,我们拥有数字7,二进制值为(0111_2 ),因为它是两个的补充值,我们需要在最重要的位上添加一个额外的0,以表示其是一个正值。

在这里,要验证1001的确是-7的十进制格式,我们不像平时那样计算小数表示,但是,我们将添加所有位,但减去最重要的位:

(-2^3 * 1 + 2^2 * 0 + 2^1 * 0 + 2^0 * 1 = -8 + 1 = -7 )

现在,我们了解了两者补充的工作原理,我们可以回到最初的问题:为什么Java只能将127表示为最大值,而不是128个字节数据类型。因为每个字节在Java中包含8位和字节是两个的补充,这意味着我们必须为标志保留1位,而其余的7位表示幅度,这里(11111111_2 )代表-1代表-1,而不是128。不向后。我们仍然可以代表-128,我们仍然可以代表-128,如我们所知,我们知道 (10000000_2 )是-128。

为了找到任何两者补充价值的小数表示,我们可以使用此通用公式:

(w = -a_ {n-1} 2^{n-1} + sum_ {i = 0}^{n-2} a_i 2^i )

或者,如果上面的公式看起来很复杂,我们还可以使用此过程来计算两者补充的小数值;假设我们要将(1100_2 )转换为十进制:

  • 首先,我们通过翻转所有位来找到(1100_2 )的补充,即(0011_2 )

  • 将一个添加到它,(0100_2 )

  • 将(0100 )转换为十进制,即4

  • 应用我们一开始有的标志;我们得到的结果是-4。