|
楼主 |
发表于 2012-3-18 18:15:52
|
显示全部楼层
本帖最后由 lionfun 于 2012-3-18 18:18 编辑
wAterLoo 发表于 2012-3-18 15:06
首先你要明白
减法操作其实就是 对获得减数的补码,然后再与被减数相加
那么什么是补码呢?
你的这句话16进制的减法 先要对减数取补,也就是得到减数的补码
提醒了我,文章说在进行16加法的时候,首先要进行低8为相加,如果有进位输出,则在进行高8位相加的时候作为进位输入,这个没有问题;但是说到16位减法的时候,也说低8位相减,如果有进位输出,则作为高8为的进位输入。我之前老是错误的理解既然分别进行低和高8位的相减,那么都要先对减数取反加1,然后我就总是理解不了低8为相减的产生的这个这个借位用来做什么,原来是我一直理解错误了。
取补只是对低8位的减数取补,而高8位取补还是取反只是一个结果,要看进位输入(也是低8位的借位减)是1还是0,为什么这么说呢,我做了两个例子来理解。
例子1:
2356H - 2079H
先进行低8位相减:
56H的2进制码为:01010110,79H的二进制码为:01111001,先求-79H的补码(79H取反加1)为:10000111,将上面的式子转化为2进制相加
01010110
+10000111
---------------
11011101
结果直接当做原码即16进制的DD,可以看出没有进位,借位减为0,我们接着进行高8位相减:
23H的2进制码为:00100011,20H的反码(注意是反码,不是补码)为:11011111,由于低8位相减没有进位不用加1则:
00100011
+11011111
----------
100000010
结果有溢出,只取右边8位,即:00000010作为结果,转为16进制为2H
最终的结果就是:2DDH
例子2:
2356H - 2020H
为了方便,取的被减数和例子1的相同。先进行低8位相减:
56H的2进制码为:01010110,20H的2进制码为:00100000,同样先求-20H的补码(20H取反加1)为:11100000,转化为2机制相加
01010110
+11100000
-----------
100110110
结果溢出,只取右边8位,即:00110110,16进制为:36H,由于有溢出借位减为1,我们接着进行高8位相减:
23H的2进制码为:00100011,20H的反码(注意是反码,不是补码)为:11011111,由于低8位相减有进位(即借位减)20H的反码要加1即:11100000,则:
00100011
+11100000
----------
100000011
结果有溢出,只取右边8位,即00000011作为结果,转为16进制为3H
最终的结果就是:336H
这样就明白了,所谓的“借位减”,就是低8位每次相减都要从高位借一位,这个可以通过取反再加1实现,例如8位2进制x(针对负数)取反,其实就是( 11111111 - x + 1) = (100000000 - x),如果进行进行的是低8位相减这个100000000就是认为是从高8位借来的,借是要借的,用不用要看实际情况了,比如例子1就用了这个借位,所以借位减为0,意思是不用还这个100000000给高位了,因为56H比79H小;例子2呢,虽然他也借了100000000,但是他用不着,因为56H比20H大,所以借位减为1,意思是把这个借来的100000000还给高位,所以高位进行运算的时候有个进位1就是这么来的,原来这个“借位减”的意思是“借了要减掉”到底是减0还是减1,就看低8位相减要不要用了。 |
|