对于有符号数先乘 2 / 3,将 2 / 3 左移 31 位留最高位表示符号位,为 h(魔法数)与原数 imul,则直接取 edx 即为答案
为何要乘 2 / 3 直接得答案呢?
先查对于无符号数乘 2 / 3,将 2 / 3 左移 32 位为 0AAAAAAABh。與原数 mul 之后需要右移 32 位回,但由于汇编乘法规则直接取用 edx 即可。由于乘 2 / 3则将 edx 右移 1 位才是结果。
对于有符号数来说由于需要右移 31 位,并再右移 1 位以抵消 2 / 3 成为 1 / 3而直接取用 edx 刚好完成了右移 32 位(也就是说 eax 的 32 位是没用的)。这也即为何除 3 要乘 2 / 3 的原因
通过左移右移的操作,使得除整数变为乘小数左移之成为乘整数(近似值),从而达到优化计算的目的