首页 文章

两个补语的定义?

提问于
浏览
0

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

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 回答

  • 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
    

相关问题