如何手动计算-8 idiv -4?带符号除法idiv运算方法问询
带符号除法(idiv)手动计算规则
核心逻辑
x86的idiv是基于补码的带符号除法,手动计算可分为两种思路:一种是先转成正数运算再处理符号,另一种是直接用补码长除法(更贴近硬件实现)。
思路1:符号分离法(最易上手)
步骤简单,适合快速计算:
- 先提取被除数和除数的符号,确定商的符号:同号得正,异号得负
- 取被除数和除数的绝对值,用无符号长除法计算数值部分的商和余数
- 把商转成对应符号的补码,余数的符号必须和原被除数一致(
idiv硬性规则)
示例:你的问题 -8 / -4
- 符号:被除数-8(补码
11111000)、除数-4(补码11111100)均为负,商为正 - 绝对值计算:
8 / 4 = 2 - 商转补码:正数的补码等于原码,即
00000010,和程序运行结果完全一致
思路2:补码长除法(贴近硬件实现)
如果要模拟硬件的idiv运算流程,需遵循补码除法的规则,这里用4位补码示例演示:
示例:
-4(补码1100) / -2(补码1110),预期商为2(补码0010),余数0
补码长除法规则:
- 被除数需要先符号扩展到除数的2倍长度(比如8位
idiv时,8位被除数要扩展为16位,高位全部填符号位) - 每次比较当前余数(或被除数片段)与除数的符号:
- 符号相同:减去除数(补码减法=加除数的补码),商上
1 - 符号不同:加上除数,商上
0
- 符号相同:减去除数(补码减法=加除数的补码),商上
- 最终余数的符号必须和原被除数一致
4位补码除法演示(被除数扩展为8位)
被除数-4的8位补码:11111100
除数-2的8位补码:11111110
00000010 ________________ 11111110|111111000000 11111110 -------- 11110100 11111110 -------- 1101100 11111110 -------- 101010 11111110 -------- 10000 11111110 -------- 00010 11111110 -------- 00000 (余数为0,与被除数同号)
最终商的低4位是0010,即十进制2,符合预期。
关键注意点
idiv的被除数长度必须是除数的2倍:8位除数对应16位被除数(AX),16位除数对应32位被除数(DX:AX),以此类推- 余数的符号始终与原被除数一致,比如
-5 / 2的运算中,商为-2,余数为-1(满足-5 = 2*(-2) + (-1))
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

