0

我在这里阅读了几个问题/答案:

python中的二进制补码

is-twos-complement-notation-of-a-positive-number-the-same-number

有人给出了一些示例代码来创建一个数字的二进制补码:

def twos_comp(val, bits):
    """compute the 2's compliment of int value val"""
    if( (val&(1<<(bits-1))) != 0 ):
        val = val - (1<<bits)
    return val

另外有人这样定义二进制补码:

二进制补码表示法使用 n 位二进制补码来翻转符号。对于 8 位数字,从 2^8 中减去该数字以产生负数。

这些声明没有受到质疑。但是,这与我对二进制补码的理解相矛盾。我认为它是通过反转二进制数并加 1 来计算的。(理解数字表示的位数是有限的。)

此外,二进制补码应该具有它是原始数字的加法倒数的性质。但是,twos_comp 的输出似乎没有。在我的手工计算(以及我编写的一些测试代码)中,我看到当一个数字和它的二进制补码相加时,1 溢出,其余位为零,因此它具有加法逆属性。

二进制补码是否有多个定义,我是否感到困惑,或者其他帖子中的定义和功能完全错误?

4

1 回答 1

1

二进制补码实际上是通过将二进制数取反并加 1 来计算的,对于负数。这样 abs(-1)=1=01 -> bitwise_inv(abs(-1))+abs(-1)=FE+1=FF。这相当于提供的从 2^8 中减去数字的定义(这应该不难看出)。

您提供的示例代码不会以任何有用的方式计算二进制补码。我根本不明白它试图做什么,似乎与“从 2 ^ 8 中减去数字”完全不同,因为从数字中减去 2 * 8,同时也没有记住当我们提到值时我们的意思是二进制补码的无符号值。

这是一个更正确的实现,使用相同的模板。请注意,这正是“从 2^8 中减去数字”。

def twos_c(val,bits):
  if ((val&(1<<(bits-1)))!=0):
    val=(1<<bits)-abs(val)
  return val
于 2013-10-31T15:13:16.847 回答