【问题标题】:Why does two's complement still work when working with large numbers?为什么在处理大数时二进制补码仍然有效?
【发布时间】:2021-06-05 00:00:45
【问题描述】:

我最近在阅读二进制补码并注意到,当使用非常接近极限的无符号整数(大多数数字足够大以至于 MSB 为 1)时,减法似乎仍然有效,即使有符号位仍然应该是填写实际号码信息。比如取254和252,分别用8位表示为0b111111100b11111100。减法将取 252 的 2 的补码,所以它是 0b11111110 + 0b00000100,它给出了正确的结果 0b00000010 = 2。为什么这完全按预期工作?

PS.:我还注意到,如果我将无符号数视为二进制补码形式,我会得到 -2 和 -4,它们会减去 2。是这可能是系统是如何建立并最终被设计使用的结果?

【问题讨论】:

  • 0b11111110 - 0b00000100 = 0b00000010 怎么样?哦,您是说-252 与+(-252) 相同。我想你有一个错字。让我感到困惑的事情应该是 + 不是 - 在您的帖子中。
  • (忽略符号中的错字)为什么它不起作用?
  • 如果他是一个 8 位数字的二进制补码,N 是 (256 - N)。如果 8 位加减法是模 256,那就是N1 - N2 = (N1 - N2)%256。如果将 N2 的减法替换为其二进制补码的加法,则会得到 (N1 - N2) = (N1 + (256 - N2))%256。模运算是可分配的,而且256%256 = 0,所以你发现对于N1和N2的任意值,加上N2的补码就等于减去N2。
  • @JohnFilleau 确实是我的错字。我会马上改正的,很抱歉。
  • @ThomasJager 我的意思是,据我了解,由于我发现的大多数资源都将二进制补码分析为有符号数,因此该操作不适用于超出有符号数通常范围的无符号数。

标签: math binary binary-data subtraction twos-complement


【解决方案1】:

根据 John Filleau 的评论:

如果8位数字N的二进制补码是(256 - N),如果8位加减法是模256,那就是N1 - N2 = (N1 - N2)%256。如果将N2 的减法替换为其二进制补码的加法,则得到(N1 - N2) = (N1 + (256 - N2))%256。模运算是可分配的,而256%256 = 0,所以你发现对于N1和N2的任意值,加上N2的二进制补码就等于减去N2

我在分析这个操作时的主要错误是(除了忽略值换行的事实之外)假设计算机需要将无符号整数转换为有符号整数来执行减法运算,如上所示,这不一定是案子。补码的想法适用于无符号数和有符号数。

【讨论】:

    猜你喜欢
    • 2011-10-14
    • 2016-05-01
    • 2023-03-25
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多