assembly - 加法器如何执行无符号整数减法?

标签 assembly unsigned subtraction

假设 AB是有符号的正整数,那么对于 A-B ,它是使用 A+2 计算的B 的补码.

例如,在 4 位二进制系统中,对于有符号整数,我们有7-3=0111-0011=0111+1101=(1)0100 ,
括号中的 1 是进位位。根据有符号整数的溢出规则,我们知道没有溢出,因此结果是正确的。

然而,对于无符号整数,如果我们计算 7-3 会发生什么?如果我们使用上面提到的相同方式:

7-3=0111-0011=0111+1101=(1)0100

然后,根据无符号整数的溢出规则,由于进位存在溢出。换句话说,0100是错误的,因为有溢出。但实际上,我们知道结果0100是正确的。

如果我的分析是正确的,使用加法器进行无符号整数减法是不是错了?

最佳答案

你的分析不正确。实际上取决于 CPU ALU 单元。 :)

在第一种情况下,您使用的是 4 位整数,但您忘记了 4 位符号整数的最高位是 签到 !所以你只检查进位和溢出状态,而不是 状态位。

在一般二元算术运算中 添加 有符号整数和无符号整数相同。只有受影响的标志不同。

其实你必须考虑:

  • 在有符号整数算术 随身携带 , 溢出 标志。
  • 仅在无符号整数算术中 随身携带 旗帜。

  • 详细说明:

    补函数的挖掘是取反,所以从正数取相反数,从负数取正数。我们可以通过两种方式进行二进制补码。让我们看看数字 3 的两种情况。
  • 在无符号算术是 compl (3) = b'0011' xor b'1111' + b'0001' =
    b'1101' + 随身携带 (进位是 设置 仅在 compl (0))
  • 在带符号的算术数字是符合 (3) = b'10000' - b'0011' = b'1101' 什么
    等于 b'0000' - b'0011' = b'1101' + 随身携带 (进位是 清除 仅在
    复合 (0))

  • 在第一种情况下,函数补码也对进位位进行补码,我们还有名为 borrow 的进位标志的第二种解释。 .

    在第二种情况下,一切都清楚了。如果我们在补码处有进位(溢出),这意味着我们需要另一个溢出来规范减法的结果。

    关于assembly - 加法器如何执行无符号整数减法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8053053/

    相关文章:

    java - 在 Java 中对字符进行求和和相减,并且始终得到 ASCII 范围内的结果

    assembly - 高内存地址与低内存地址和分支

    c - 带符号 int 的位移位重置过多

    c - 使用 while 循环进行减法

    python - python中列表的减法,优化速度

    java - 将 DWORD 字节数组转换为无符号长数字

    assembly - BIOS 中断时光标不会移动(x86 汇编/NASM)

    assembly - ASM 'sall' 命令带有单个参数?

    assembly - 可以跳过每个第二个字节的SSE mov指令?

    integer - 有符号和无符号整数?