两个补语的定义?

时间:2013-10-31 14:49:45

标签: twos-complement

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

twos-complement-in-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来计算的。(理解数字表示的位数有限。)

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

对于二元补语是否存在多个定义,我感到困惑,或者其他帖子的定义和功能是否完全错误?

1 个答案:

答案 0 :(得分: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