无符号和有符号划分的结果之间是否有任何相似之处?

时间:2016-08-25 14:43:48

标签: assembly binary division integer-arithmetic

我有recently learned对于m位x n位乘法(产生(m + n)位产品),min(m,n)结果的最低有效位总是相同的乘法是无符号还是有符号。

对于m位/ n位除法(产生m位商和n位余数),对于无符号和有符号除法,是否有任何位总是相同的,或者(对于某些位)输入)两种划分方法产生完全不同的结果吗?

2 个答案:

答案 0 :(得分:2)

如果任何操作数具有MSB集(即为负),则无符号和有符号除法明显不同 如果两个操作数中的MSB为零,(即两个数字都为正),结果将是相同的。

当使用无符号除法时,操作数中的所有位都被解释为无符号,即负数被解释为(非常)大整数。

当使用有符号除法时,首先将操作数转换为绝对数,然后重新应用操作数的符号。

结果如下:

mov eax,1
xor edx,edx    
mov ecx,-1
div eax,ecx    //eax = 0, because the -1 is interpreted as a large positive   
div -1,2       -> $7FFFFFFFF because div 2 shifts bits right by 1.

数。

mov eax,1
xor edx,edx    //cdq if eax is negative
mov ecx,-1
idiv eax,ecx   //eax = -1, because 1 / -1 = -1.
idiv -1,2      //-> 0 because 1 shr 1 = 0 and -0 is still 0.

在某些处理器div(包含所有正操作数)将比idiv快一个周期,因为它必须减少“思考”。然而,鉴于分裂是一个非常缓慢的操作无论如何,这几乎不重要。

答案 1 :(得分:1)

您是否从先前的问题中学到了如何做到这一点?回到小学数学,长分(即多大/慢(许多时钟)师的工作原理)。

让我们采用位模式0b10101010 / 0b101,它是无符号0xAA / 5或有符号-0x56 / -3。我不得不作弊并使用我的计算器。无论如何,先轻松一个

    -----------
101 ) 10101010


        100010
    -----------
101 ) 10101010
      101
      === 
        00101 
          101
          ===
            00

所以结果是0x22

但是对于签名的部门来得到正确的答案,我们需要做无符号的,这就是你在小学时手工做的,然后再应用这个符号,这样我们就不会将0b101划分为0b10101010而是将0b11分成0b11 0b1010110

        11100  
    ---------
 11 ) 1010110
       11 
      ===
       100
        11
       ===
         11
         11
         ==
          010

所以答案是0x1C余数0x2,因为两者都是负数,结果是正数。

类似于加/减和有符号和无符号乘法,你否定或不进入并否定或没有出现的东西。除非在移位后一次又一次地添加相同的数字,否则除法不会相乘。你从左边开始也不是从右边开始,所以我不知道它会如何在它们之间产生任何类型的共同模式。上面说明了这一点,但也证明了如果你否定一个你预先得到很多共同点,那可能是运气不好。

我不会尝试将位变量abc分成def而不像加/减和乘法它不起作用,这就是为什么有些百分比的处理器没有乘法或除法,或者有些有乘法而不是除法,你可以通过使用大量的逻辑来实现乘法更快,也许也就是那个或许多时钟。

也许看看Hackers Delight看看分裂快捷方式,从中可能会出现一些模式会使得一些比例相同,但我对此表示怀疑。你必须得到实际的二进制操作数进入除法逻辑,并且分子中的高位可能是相同的有符号或无符号,但这意味着它们是两个完全不同的数字。如上所示,如果采用具有不同符号表示的相同位模式并将这些相同的位模式提供给无符号或有符号的除法,则会在分子和/或分母中得到不同的位模式,从而得到不同的结果,没有预期匹配的模式。如果两个数字都是正数,则两者都应该给出相同的结果。