二进制减法借位法与1补码法实操疑问(50-23)
二进制减法与ALU原理问题解析
问题1:借位法出现无1可借的情况
核心问题是未将减数与被减数对齐到相同位数。50是6位二进制110010,23必须补为6位010111,对齐后再执行借位法就不会出现无位可借的情况:
1111 (借位标记链) 110010 (50) - 010111 (23,6位补位后) -------- 011011 (27)
具体借位步骤:
- 第0位:0-1不够,向第1位借位,第1位1变0,第0位得10-1=1
- 第1位:0-1不够,向第2位借位,但第2位是0,需继续向第3位借;第3位也是0,继续向第4位借;第4位1被借后变0,第3位得10,再借给第2位1,第3位剩1;第2位得10后借给第1位1,第2位剩1;第1位得10-1=1
- 第2位:1-1=0
- 第3位:1-0=1
- 第4位:0-1不够,向第5位借位,第5位1变0,第4位得10-1=1
- 第5位:0-0=0
全程每一步的借位都有高位可借,完全不会出现无1可借的情况。
问题2:第4位0-0得1的矛盾
首先是位对应错误:你可能用了5位的23(10111)和6位的50(110010)计算,导致位的对应关系混乱。对齐到6位后:
- 50的第4位是
1(二进制110010从右数第5位是最高位,第4位是左数第2位的1) - 23的第4位是
1(6位补位后是010111,第4位是左数第2位的1) - 结果27的第4位是
1,完全符合减法逻辑。
另外,二进制减法的异或门仅负责无借位的本位计算,实际ALU中减法会结合借位逻辑:本位结果 = 被减数位 - 减数位 - 低位借入位。你所说的“0-0应得0”是忽略了低位借位的情况,当有借位传入时,本位计算结果会发生变化。
问题3:1s补码法得到111010(58)的问题
1s补码(反码)计算减法必须遵守两个关键规则:
- 减数与被减数必须对齐到相同位数;
- 相加后若产生进位,需将进位加到结果的最低位(循环进位)。
正确计算过程:
- 23的6位原码是
010111,取反得到1s补码101000; - 被减数+减数的1s补码:
110010 + 101000 = 1011010(7位结果,最高位是进位1); - 将进位1加到结果的最低位:
011010 + 1 = 011011,即十进制27。
你得到111010的原因,要么是没给23补位(用5位反码001000和6位被减数相加),要么是没处理循环进位,导致结果错误。
内容的提问来源于stack exchange,提问作者6502Assembly4NESgames
相关产品推荐
相关产品推荐

