什么是"减法产生借款"和#34;无符号下溢"条件与它有关吗?

时间:2017-05-30 03:07:57

标签: binary numbers arm logic

什么是无符号下溢以及subtraction produced a borrow的关系是什么?这是ARM体系结构参考手册的摘录。

  

对于减法,包括比较指令CMP,设置C.   如果减法产生借位(即无符号,则为0)   下溢),否则为1。

https://cwe.mitre.org/data/definitions/191.html开始,整数下溢意味着从负有符号值中减去一个值以获得正值(例如,使用2位系统,b10 [-2] - b01 [1] = b10 + b10 + 1 = b01 = +1)。我使用的事实是,在2的补码系统中,减法是位加法+ 1的加法。

无符号undeflow应该与整数下溢不同,因为相同的操作会产生正确的下限(例如b10 [2] - b01 [1] = b10 + b10 + 1 = b01 = +1)。但我不确定是什么原因导致无符号下溢情况。我也无法看到这与subtraction produced a borrow时的情况有什么关系。

我有点明白,当b00 [0] - b01 [1] = b00 + b10 + 1 = b11 = 3时会发生无符号下溢。但由于它的无符号下溢而无法理解,因此会让人感到困惑。似乎产生了借款(没有产生进位) - 来自John Bollinger的回答A "borrow" is the subtraction analogue of a "carry". 然后,借用是一个携带的对立面?

2 个答案:

答案 0 :(得分:2)

二进制减法是用加法完成的,它是二重补的美。从小学我们知道a - b = a +( - b)和二重补充告诉我们-b = ~b + 1(反转并加一)。所以a - b = a +(〜b)+ 1,你可以通过反转b并设置进位而不是清除它来做。 (反转b并反转进位)。

所以5 - 4

 1111
  101
+ 011
=====
  001

这是用小学数学完成的,不会有借用。

和4 - 5

 0001
  100
+ 010
=====
  111

如果这已经完成了小学数学,那将会借用。

并且您可以对其他位模式重复此操作,您将看到借用导致无执行且没有借位导致执行。

我们知道,当它是加法时,进位位是无符号溢出,有些处理器在减法时反转进位(就像反转进位和第二操作数一样),有些不,不得不看看武器细节在这个,但该位一般在进位标志中结束(如果处理器甚至有标志)。因此,基于文档或有时您必须通过这种方式破解(做实验)但没有执行反转是借用和进位相反。

我认为无符号下溢与借用相同,4 - 5表示您下溢。如上所述,未加固的4 - 5 = 7。但是签名4 - 5 = -1,对于加法/减法,处理器不知道从无符号签名那些是与程序员和/或更高级语言相关的概念。再两次补充美丽。

答案 1 :(得分:1)

  

在基本算术中,进位是从一列数字转移到另一列更高位的数字。标准算法的一部分是通过从最右边的数字开始并向左移动来将数字加在一起。例如,当添加6和7以产生13时,“3”被写入同一列并且“1”被带到左侧。当用于减法时,该操作称为借用   <子> Wikipedia

无符号整数减法并没有根本不同。

术语下溢来自浮点运算,并在LIA-1中定义:

  

b)下溢:未接地结果的绝对值小于最小正常值,并且舍入结果可能由于非规范化而失去准确性(如果指数范围无限制。)    IEC10967§4.1.3

术语整数下溢实际上是术语下溢的挪用。实际上意味着减法的结果不能用固定宽度整数类型表示。