我在这里阅读了几个问题/答案:
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 溢出,其余位为零,因此它具有加法逆属性。
二进制补码是否有多个定义,我是否感到困惑,或者其他帖子中的定义和功能完全错误?