【问题标题】:How to Add/Subtract binary如何加/减二进制
【发布时间】:2023-03-20 00:40:01
【问题描述】:

我知道在减去二进制文件时,您应该将第二个二进制文件转换为它的 2 的补码。但在以下情况下:

                 01101+11110

11110 已转换为其 2 的补码。换句话说,现在的工作方程是:

                  01101+00010

现在我很困惑何时应该转换。任何帮助将不胜感激!

【问题讨论】:

  • 什么时候应该转换?您已经说过,减法时应该转换
  • @AkutaHinako 是的,我知道减去时我必须转换。但是我的一个同学坚持认为11110以上的情况应该先转换为它的2的补码,然后再添加它。这是正确的还是您直接添加?
  • 对于上述情况,您可能会注意到它有代数溢出。
  • 所以如果有溢出,我是否必须先转换它,因为十进制表示它是 13-2=+ 所以上面的答案应该是肯定的???
  • 电脑会直接把它们加在一起,放弃进位所以加起来就可以了

标签: math binary


【解决方案1】:

不过,我的评论可能不够准确。我把 CARRY 误认为 OVERFLOW

-

所以稍微解释一下

你的操作是:

01101 (binary) + 11110 (binary) = 01011 (binary)

-

如果签名(正确结果):

  13 (decimal) +   -2 (decimal) =    11 (decimal)

如果未签名(不希望的结果):

  13 (decimal) +   30 (decimal) =    11 (decimal)

-

二元算术运算中有两件事,分别称为 OVERFLOWCARRY

对于 addition 操作,CARRY 标志被设置,如果 两个数字相加会导致执行最重要的数字 (最左边的)位添加。

示例:

1111 + 0001 = 0000(进位标志开启)

0111 + 0001 = 1000(进位标志关闭)

对于减法操作,CARRY标志被设置,如果 两个数字的减法需要借用最重要的(最左边的) 减去的位数。

示例:

0000 - 0001 = 1111(进位标志打开)

1000 - 0001 = 0111(进位标志关闭)

对于 addition 操作,OVERFLOW 标志被设置,如果 两个具有相同最高有效位的数字相加(0 或 1) 和结果都产生了一个具有不同大多数的二进制文件 重要位。

示例:

0100 + 0100 = 1000(溢出标志开启)

0100 + 0001 = 0101(溢出标志关闭)

-

注意:

在无符号算术中,观察进位标志以检测错误。

在有符号算术中,进位标志不会告诉您任何有趣的事情

-

在有符号算术中,观察溢出标志以检测错误。

在无符号算术中,溢出标志没有告诉你任何有趣的事情

-

在汇编语言中添加无符号二进制文件时检查错误

ADD BX, AX
//check carry here

检查汇编语言中减去无符号二进制文件的错误

SUB BX, AX
//check carry here

检查在汇编语言中添加签名二进制文件的错误

ADD BX, AX
//check overflow here

检查汇编语言中减去签名二进制文件的错误

SUB BX, AX
//check overflow here

有关 ADD/SUB 中标志集的详细信息,请参阅此处

carry/overflow & subtraction in x86

【讨论】:

    【解决方案2】:

    正如您正确理解的那样,您想做一个二进制补码。逻辑将利用二进制补码的优点来使用加法做减法。

    我们被教导“取二进制补码”的一种方法是反转(一个补码)并加一个。

    所以如果你想做 4 - 7 (0b00100 - 0b00111)

    也就是0b00100 + 0b11000 + 1,可以利用lsbit的进位:

          1
      00100
    + 11000
    ========
    

    以 2 为基础做小学数学。

     000001
      00100
    + 11000
    ========
      11101
    

    如果这被解释为有符号操作,则为 -3(有符号和无符号的加/减逻辑相同,处理器不知道,只有程序员知道)。

    我假设不是

    01101+11110

    你想减去这两个数字

    01101-11110 13 - (-2) 如果解释为有符号数

     000011
      01101
    + 00001
    ========
      01111
    

    13 + 2 = 15

    msbit 的进位和进位相同,因此没有带符号溢出,结果很好。注意也没有无符号溢出。

    因此,对于减法,您将进位和第二个操作数与您要加法的内容相反。一些处理器架构反转进位以指示借位,有些则没有。您已经检查了您正在使用的处理器的架构,以了解您的处理器是否如此。不幸的是,很少有人在这种级别的文档上做得很好,所以有时你必须通过实验来弄清楚。

    对于加法,您不要将任何操作数反转到加法器中。操作(add vs sub)决定了你是否在进入加法器的过程中取反。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      相关资源
      最近更新 更多