我有recently learned,对于m位x n位乘法(产生(m+n)位乘积),min(m,n)
结果的最低有效位总是相同的,无论乘法是无符号还是有符号。
对于m位/n位除法(产生m位商和n位余数),是否有任何位对于无符号除法和有符号除法总是相同的,或者(对于某些输入)这两种除法方法产生完全不同的结果?
我有recently learned,对于m位x n位乘法(产生(m+n)位乘积),min(m,n)
结果的最低有效位总是相同的,无论乘法是无符号还是有符号。
对于m位/n位除法(产生m位商和n位余数),是否有任何位对于无符号除法和有符号除法总是相同的,或者(对于某些输入)这两种除法方法产生完全不同的结果?
2条答案
按热度按时间mklgxw1f1#
如果任何操作数设置了MSB(即为负),则无符号除法和有符号除法有明显不同。
如果两个操作数中的MSB都是零(即两个数字都是正数),则结果相同。
使用无符号除法时,操作数中的所有位都解释为无符号,即负数解释为(非常)大的整数。
div
的结果:使用有符号除法时,操作数首先转换为绝对数,然后将操作数的符号重新应用于除法结果。
idiv
的结果:在一些处理器中,
div
(所有操作数都是正的)比idiv
快一个周期,因为它需要做的“思考”更少。然而,考虑到除法是一个非常慢的操作,这几乎无关紧要。huwehgph2#
你没有从前面的问题一中学到如何做吗?回到小学数学,长除法(这就是老/慢(许多时钟)除法的工作原理)。
让我们以位模式0 b10101010/0 b101为例,它要么是无符号的0xAA / 5,要么是有符号的-0x56 /-3。我不得不作弊,使用我的计算器。
所以结果是0x 22
但是对于有符号除法,要得到正确答案,我们需要做无符号除法,这是小学时手工做的,然后在以后应用符号,所以我们不是将0 b101除以0 b10101010,而是将0 b11除以0 b1010110
所以答案是0x 1C余数0x 2因为两个都是负的所以结果是正的。
类似于加/减以及有符号和无符号乘法,你否定或不进去,否定或不出来,除法不像乘法,它只是相同的数字在移位后一遍又一遍地相加,你从左边开始,而不是右边,所以我看不出它如何在它们之间产生任何共同的模式。上面的例子证明了这一点,但也证明了如果你否定了一个,你会得到很多公共位,这可能是愚蠢的运气。
我不会尝试将位变量abc除以def,不像加/减和乘那样,它不会那样工作,这就是为什么有些处理器没有乘或除,或者有些处理器有乘但没有除,您可以通过使用大量逻辑使乘更快,除法也可能更快,或者使用大量时钟。
也许你可以看看Hackers Delight,看到除法的捷径,也许会出现一种模式,使某个百分比的位相同,但我怀疑,你必须让实际的二进制操作数进入除法逻辑,分子中的高位可能是相同的有符号或无符号,但这意味着它们是两个完全不同的数字。如上所述,如果您使用具有不同符号表示的相同位模式,并将这些相同的位模式输入unsigned或signed除法时,分子和/或分母中的位模式不同,因此结果不同,没有模式匹配。如果两个数字都是正数,那么两者应该给予相同的结果。