补码计算困惑,来个懂的解惑下

看了一下相关帖子的知识普及,都说一个数的正数补码和负数补码相加等于0。
但是我自己实际算出的并不是0。这是什么原因?
1的补码是:0000 00001;
-1的补码是:1111 1111;
那么他们底层做加法不应该等于:10000000吗?
为什么会等于0呢?

前提:假设1和-1都是一个字节的长度(8 位)
则:
1的补码是 0000 0001
-1的补码是1111 1111
这两个相加0001 0000 0000,注意有一位溢出;
因为两个一字节长度的数据相加,结果应然是一字节,故取后八位。
得到0000 0000,就是0。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/231584
  • 你也可以参考下这篇文章:编写函数实现从键盘输入一个1000以内正整数,将其按照二进制进行输出。例如,将135打印成10000111
  • 您还可以看一下 程张浩老师的微信小程序项目实战之我画你猜视频课程课程中的 用户作品的发表流程01小节, 巩固相关知识点
  • 除此之外, 这篇博客: 有时候会打印出-858993460,这个数字是什么意思?中的 -858993460 这个数字是什么意思? 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题的原因在于补码加法中,当两个补码相加的结果溢出时,溢出的位会被丢弃,这会导致补码加法结果并非所期望的结果。

    下面是对于1和-1的补码相加的详细解释:

    1的原码是: 0000 0001,对应的补码也是: 0000 0001; -1的原码是: 1000 0001,对应的补码是: 1111 1111。

    根据补码加法规则,我们将两个补码相加:

       0000 0001  (1)
    +  1111 1111  (-1)
    ------------
    

    从右往左逐位相加,得到的结果如下:

       0000 0001  (1)
    +  1111 1111  (-1)
    ------------
    =  0000 0000  (0)
    

    最终的结果是0,而不是所期望的 1000 0000。

    这是因为在补码加法中,最高位表示的是数值的正负性,1代表负数,0代表正数。在补码加法中,当最高位(符号位)发生溢出时,溢出的位会被丢弃,这个过程被称为溢出。

    因此,在补码加法中,两个补码相加后溢出的结果会导致结果为0。这也是为什么1的补码和-1的补码相加等于0的原因。

    要想得到所期望的结果1000 0000,可以使用更多的位数进行计算。在一个8位的补码计算中,最高位是用来表示正负性的符号位,因此无法得到所期望的结果。

    以下是一个用Python代码进行补码加法计算的例子:

    def twos_complement_addition(num1, num2, num_bits):
        mask = (1 << num_bits) - 1  # 构建掩码,用于确保计算结果在补码表示范围内
        num1 = num1 & mask  # 根据位数截断num1
        num2 = num2 & mask  # 根据位数截断num2
        result = num1 + num2  # 补码相加
        result = result & mask  # 根据位数截断结果
        return result
    
    num1 = 1  # 0000 0001
    num2 = -1  # 1111 1111
    num_bits = 8  # 8位补码
    result = twos_complement_addition(num1, num2, num_bits)
    print("补码相加结果:", format(result, '08b'))  # 输出结果,格式化为8位二进制数
    

    运行以上代码,输出结果为:

    补码相加结果: 00000000
    

    这个例子中,通过使用位操作来确保补码相加结果的范围,并按照位数要求来截断结果,最终得到了补码加法的正确结果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^