关于二进制补码运算【转载】

基本的规则就是:
加法:
整数: [A]补 + [B]补 = [A+B]补 (mod 2^(n+1))
小数: [A]补 + [B]补 = [A+B]补 (mod 2)

减法:
整数: [A-B]补 = [A]补 + [-B]补 (mod 2^(n+1))
小数: [A-B]补 = [A]补 + [-B]补(mod 2)
[-B]补的求法就是 [B]补的连同符号位在内,每位求反加一

ps:这里假定了A,B都是正数

如果你直接写出了负数的补码,那么直接计算就好了。由[-B]补求解[B]补,或者由[B]补求[-B]补,都是连同符号位每位求反加一,本身就表达着,只要是补码,直接计算即可。
下面的例子可以很好说明:

设机器数字长为8位,一位用作符号位。若A = +15, B = +24,求[A-B]补,并且还原成真值。
ps:这里的还原你真的是把求出的补码算出真值不是用15 - 24 = -9口算的吗。。

解:首先是换成二进制原码:A = +15 = 0,0001111; B = +24 = 0,0011000
换成补码:[A]补 = 0,0001111, [B]补 = 0,0011000,[-B]补 = 1,1101000

以上是标准的算前准备
[A-B]补 = [A]补 + [-B]补
0,0001111
+1,1101000
= 1,1110111

也可以这么想:直接求A-B补码相减:
0,0001111

  • 1,1101000
    = 1,1110111

从第九位(未知)借来一个2,求得结果也是我们需要的补码。

真值为-9。

总结:不论操作数是正还是负,在做补码运算时,只需要将符号位和数值部分一起参加运算,并且将符号位产生的进位自然丢掉即可。也可以从更高位借过来一个参与运算,这样,符号位会用1的方式表示,好吧我没你大,形成的是负值。

在这种减法形式的计算中,需要注意的是借位的事情。
十进制中:
1000

  • 99
    =901

过程是这样:1000的个位是0减不动,向高位借来一个10,在高位看来只是1但是下面看来是10,好的,10可以减动9了得到个位是1;1000的十位是0,而且还被个位借去了一个,所以严格来说十位叫-1,好的,-1减不动9,需要从百位借,百位给了一个在它看来是1,但在十位看来是10,好的,十位借到了,先还自己的债务1,只剩9了,9再减9,可以减动了,得到0;1000的百位自己也是0,且被借走了一个,因此可以是-1,往千位借,还完债务,剩9,没什么好减的了,于是最终结果还是9.
所以得到901.

同理,在二进制下,也是一样的思路。
用一个例子来看:求1,0100011 - 1,1010011
1,0100011
-0,0101101
=0,1110110

过程:也是从第一位开始减,1-1 = 0;第二位:1-0 = 1;第三位:0-1 = 1,且第四位有1的负债(不看存款);
第四位:存款是0,负债是1,那么自己就是-1啊,减不动1,于是借来2,先还负债,剩下1,再减1 = 0;
第五位:也负债1,借来1,减的是0所以还剩1;
第六位:本来是1,被第五位借走了,所以只剩0了,减不动1,所以向第七位借来2,减去1还剩1;
第七位:本身是0,被第六位借走了1,所以是-1,要减0,先借来2,还债后剩1,减0还是1
第八位:本身是1,被借走了,好嘛,那就 剩0了,刚好需要减的也是0,不要再往上借了。当然,需要借的时候也行,那个超出八位以后的东西,从虚空中拿来,不用还!

溢出判断:
1.只有一位符号位的,实际参加操作的两个数,这个是指,如果是A-B,看到是[A]补和[-B]补的符号位
如果这两个符号位相同,但是求出来的结果(补码结果)符号位不同,那么就是溢出了。

2.有两位符号位:当两位符号位不同时表示溢出,否则无溢出。
无论是否有溢出,最高位的符号位表示真正的符号。
————————————————
版权声明:本文为CSDN博主「DrCrypto」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011240016/article/details/52433355

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值