Poison

Two's complement

此文记录简单的二进制补码与十进制值的转换逻辑,关于补码的更多原理可以参考文末的链接。

将二进制补码转换为十进制值

二进制补码系统以二进制数表示形式对正数和负数进行编码。每一位的权重是 2 次幂,除了最高位,其权重是相应的 2 次幂的负数。

由 N 位 bit 组成的整数 an-1an-2…a0 对应的十进制值 w 可以由以下公式计算得出:


最高有效位决定数字的符号,有时被称为符号位。注意,在转换为十进制时符号位也具有如上所示的权重:-(2n-1)。我们用几个 4 位 bit 的二进制补码例子来进行说明:
  • 0001 这样的二进制表示转换为十进制数字值 w 的话进行如下计算:w = -0×(23) + 1×(20) + 0×(21) + 0×(22) = 1
  • 1000 这样的二进制表示转换为十进制数字值 w 的话进行如下计算:w = -1×(23) + 0×(20) + 0×(21) + 0×(22) = -8
  • 1111 这样的二进制表示转换为十进制数字值 w 的话进行如下计算:w = -1×(23) + 1×(20) + 1×(21) + 1×(22) = -1
将十进制值转换为二进制补码

在二进制补码表示法中,非负数用其普通的二进制表示法表示,在这种情况下,最高有效位是 0。但是,表示的数字范围与无符号二进制数不同。例如,一个 8 位无符号数可以表示 0 到 255(11111111) 之间的值。然而,一个二进制补码 8 位数字只能表示从 0 到 127(01111111) 的正整数,因为其余的最高有效位为 1 的 bit 组合表示负整数 -1 到 -128。

要获得一个正整数对应负数的二进制补码,需要进行如下的操作,首先将所有 bit 位取反,在此结果上加上 1,我们用十进制数字 13 进行举例,其二进制表示为 00001101,将所有 bit 位取反得到 11110010,在此结果上加上 1 得到 11110011,及为 -13 的二进制补码表示。图示:

negative binary number

Reference

Two’s complement - Wikipedia
Math.abs returns wrong value for Integer.Min_VALUE - Stack Overflow