Assembly 无符号除法和有符号除法的结果有什么相似之处吗?

Assembly 无符号除法和有符号除法的结果有什么相似之处吗?,assembly,binary,division,integer-arithmetic,Assembly,Binary,Division,Integer Arithmetic,对于m位xn位乘法(产生(m+n)位乘积),min(m,n)无论乘法是无符号的还是有符号的,结果的最低有效位总是相同的 对于m位/n位除法(产生m位商和n位余数),无符号除法和有符号除法中是否存在始终相同的位,或者(对于某些输入),这两种除法是否产生完全不同的结果?如果任何操作数设置了MSB(即为负)无符号除法和有符号除法明显不同。 如果两个操作数中的MSB均为零(即两个数字均为正数),则结果将相同 使用无符号除法时,操作数中的所有位都被解释为无符号,即负数被解释为(非常)大的整数 使用有符号除

对于m位xn位乘法(产生(m+n)位乘积),
min(m,n)
无论乘法是无符号的还是有符号的,结果的最低有效位总是相同的


对于m位/n位除法(产生m位商和n位余数),无符号除法和有符号除法中是否存在始终相同的位,或者(对于某些输入),这两种除法是否产生完全不同的结果?

如果任何操作数设置了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
快一个周期,因为它需要更少的“思考”。然而,考虑到该司的运作速度极其缓慢,这一点也无关紧要

如果任何操作数的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
快一个周期,因为它需要更少的“思考”。然而,考虑到该司的运作速度极其缓慢,这一点也无关紧要

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

让我们采用位模式0b10101010/0b101,它是无符号0xAA/5或有符号-0x56/-3。我不得不作弊并使用我的计算器。不管怎样,先简单一点

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


        100010
    -----------
101 ) 10101010
      101
      === 
        00101 
          101
          ===
            00
结果是0x22

但是为了得到正确的答案,签名除法需要使用unsigned,这是你在小学时手工做的,然后稍后应用符号,所以我们不是将0b101除以0b10101010,而是将0b11除以0b1010110

        11100  
    ---------
 11 ) 1010110
       11 
      ===
       100
        11
       ===
         11
         11
         ==
          010
所以答案是0x1C余数0x2,因为两者都是负数,结果是正数

与加法/减法、有符号乘法和无符号乘法类似,可以求反或不求进,也可以求反或不求出。除法和乘法不同,除法是一个数在移位后反复相加。你从左边开始,而不是从右边开始,所以我看不出它们之间会产生什么样的共同模式。上面说明了这一点,但也说明了,如果你否定了一个,你会得到很多共同点,这可能是愚蠢的运气

我不打算尝试将位变量abc除以def不同于加法/减法和乘法,它的工作原理不同,这就是为什么一些处理器没有乘法或除法,或者一些处理器没有乘法但没有除法,你可以通过使用大量的逻辑使乘法更快,除法也可以,那或者很多钟


也许看看黑客们,他们乐于看到除法的捷径,从中可能会出现一种模式,使部分比特保持不变,但我对此表示怀疑。必须使实际的二进制操作数进入除法逻辑,分子中的高位可能是相同的有符号或无符号,但这意味着它们是两个完全不同的数字。如上所示,如果采用具有不同符号表示的相同位模式,并将这些相同的位模式输入到无符号或有符号除法中,则在分子和/或分母中会得到不同的位模式,从而得到不同的结果,预期没有匹配的模式。如果两个数字都是正数,那么两个数字都应该给出相同的结果。

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

让我们采用位模式0b10101010/0b101,它是无符号0xAA/5或有符号-0x56/-3。我不得不作弊并使用我的计算器。不管怎样,先简单一点

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


        100010
    -----------
101 ) 10101010
      101
      === 
        00101 
          101
          ===
            00
结果是0x22

但是为了得到正确的答案,签名除法需要使用unsigned,这是你在小学时手工做的,然后稍后应用符号,所以我们不是将0b101除以0b10101010,而是将0b11除以0b1010110

        11100  
    ---------
 11 ) 1010110
       11 
      ===
       100
        11
       ===
         11
         11
         ==
          010
所以答案是0x1C余数0x2,因为两者都是负数,结果是正数

与加法/减法、有符号乘法和无符号乘法类似,可以求反或不求进,也可以求反或不求出。除法和乘法不同,除法是一个数在移位后反复相加。你从左边开始,而不是从右边开始,所以我看不出它们之间会产生什么样的共同模式。上面说明了这一点,但也说明了,如果你否定了一个,你会得到很多共同点,这可能是愚蠢的运气

我不打算尝试将位变量abc除以def,不同于加法/减法和乘法,它的工作原理不一样,这就是为什么有些处理器没有乘法或除法,或者有些处理器有乘法但没有除法,你知道吗