【问题标题】:Is there any similarity between the results of an unsigned and a signed division?无符号除法和有符号除法的结果之间是否有相似之处?
【发布时间】:2016-08-25 14:43:47
【问题描述】:

我有recently learned,对于 m 位 x n 位乘法(产生 (m+n) 位乘积),min(m,n) 结果的最低有效位始终相同,无论乘法是否未签名或已签名。

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

【问题讨论】:

  • 考虑 1 /u -1 = 01 /s -1 = -1,它们是最大的不同。

标签: assembly binary division integer-arithmetic


【解决方案1】:

如果任何操作数设置了 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 快​​一个周期,因为它必须做更少的“思考”。然而,考虑到除法是一个非常缓慢的操作,这几乎无关紧要。

【讨论】:

  • 别忘了xor edx,edx在div之前,cdq在idiv之前。 (符号将 eax 扩展为 edx:eax)。在您的第二个示例中,您写了两次eax(-1/-1 => 除法错误,如果您记得 cdq)。或者只是选择一个不同的ISA,其中划分更简单。或 8 位分红 (mov ax, -1 / div cl)
【解决方案2】:

您没有从上一个问题中学到如何做到这一点吗?回到小学数学,长除法(这就是旧/慢(许多时钟)除法的工作原理)。

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

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


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

所以结果是 0x22

但是要让有符号的除法得到正确的答案,我们需要做无符号,这就是你在小学时手工做的方式,然后稍后应用符号,所以我们不会将 0b101 划分为 0b10101010,而是将 0b11 划分为0b1010110

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

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

类似于加/减以及有符号和无符号的乘法,你否定或不进入,否定或不出来。除法不像乘法,它只是在移位后一遍又一遍地添加相同的数字。你从左边开始而不是从右边开始,所以我只是看不出它会如何在它们之间产生任何类型的共同模式。上面展示了这一点,但也展示了如果你否定一个,你会得到很多常见的比特,这可能是愚蠢的运气。

我不会尝试将位变量 abc 划分为 def 不像加法/减法和乘法它不会像那样工作,这就是为什么某些百分比的处理器没有乘法或除法,或者有些处理器有乘法但没有除法,你可以通过使用大量逻辑、除法或大量时钟来加快乘法速度。

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

【讨论】:

  • 除数中的符号位是第 3 位,但除数中的符号位是第 8 位?这看起来很奇怪。
猜你喜欢
  • 2015-12-05
  • 2016-03-27
  • 2021-10-31
  • 2013-04-06
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多