关于原码通过反码娶到补码实现减法运算的这档事

原码:最高位被用来表示正负符号的二进制表达

          既然如此,先把十进制转换成二进制吧

🌰: 把十进制的38和-17转换成二进制⬇️

        2| 38  0           2| -17  1

         2| 19  1           2| 8  0

          2| 9  1            2| 4  0

           2| 4  0            2| 2  0

            2| 2  0            2| 1  1

             2| 1  1              0

                0

所以38的二进制表达是100110 (依次取每次模2的余数),

-17的二进制表达是-10001。

因为计算机的存储容量通常以字节为单位,

一个字节又是相连的8个二进制位组成的,

所以我们接下来用0把其它位给补上吧

(以一个字节为例)

38 ➡️ +100110 ➡️ +00100110 (这是就是它的真值)

-17 ➡️ -10001 ➡️ -00010001 (这也是它的真值)

前面提到原码的最高位被用来表示符号,

”0”表示正号,而”1”表示负号,

所以我们又可以用一次➡️了:

38 ➡️ +100110 ➡️ +00100110 ➡️ 00100110 (整好是0)

-17 ➡️ -10001 ➡️ -00010001 ➡️ 10010001 (最高位0变成1了)

好了,这就是它们的原码了,我们已经成功三分之一了!

接着看看吧!

工具人反码

负数的反码是把它的原码最高位(即表示±的那位)以外的每一位取反 (把1换成0,把0换成1)。

正数的呢?就是它的原码,不变。

上面知道,

           [38]原=00110010        [-17]原=10010001

所以,[38]反=00110010        [-17]反=11101110

补码

负数的补码是它的反码加1,正数的补码还是它的原码。

所以,原码是怎么通过反码娶到补码实现减法运算的?😍

计算机的基本运算只有加法,做乘法也是一个一个地加。

那减法呢?😑

加!,还是加,加到负数去!

计算机是二进制的,所以我们理所当然要用二进制表示负数啦,也就是补码了。

那补码怎么就可以表示负数,她连标点符号都没有…🥺

我们知道,每一个负数都有一个为正的相反数,

既然它们关系这般好,不妨试试用正数表示它的为负的相反数,

这样就不用理标点符号啦。

说干就干!

设 x,y是一对相反数,

则 x+y=0, 慢着,我们要用二进制!

好吧,重来!

则 x+y=00000000 (同样以一个字节为例)

这样看啥子啊,给x,y随便赋值看看!(就38和-17了)

令     x=00110011,

        y=10010001

令x+y= 00000000,怪麻烦的,要进位。。。😨

那如果是11111111呢?

咦?好像可以,😗

要让x+y=11111111,只要…

x是y的取反啊,

这样,x和y的每一位相加都是1+0=1,

全部位合起来不就是11111111了嘛。

但我们要的是00000000啊,🙄

加1试试呗,

11111111+00000001=100000000,这也不是啊,🤔

仔细想想,你是不是忘了什么?

我们是以一个字节为例的啊,

计算机这时就只能用8位来存储数字啊,

那多出来的一位呢?😮

不要了,不要了。

所以去掉最高位1,不就是00000000吗?

真是山重水复疑无路,柳暗花明又一村,船到桥头自然直……

诶😩,我们先把补码娶出来吧🥰,

设 x+y=11111111

等号两边同时加1 

x+y+1=11111111+00000001

即 (x+1)+y=00000000

所以x+1和y是一对相反数,

如果y是我们要表示的负数e的绝对值,

那么把y的最高位保留,其它位取反,

就得到x 了(x+y=11111111)(x是反码)

再把x加1就得到y的相反数(x+1)了,

x+1是y的相反数,负数e也是它的绝对值y的相反数,

所以x+1和负数e在某种意义上来说是相等的。

所以我们就用x+1(没有负号的补码)表示出那个负数e了。

所以,我们就可以通过补码(也就是x+1)进行加法运算来完成减法运算了。

用上面的栗子测试一下吧:

[38]补=00100110    [-17]补=11101111

[38]补+[-17]补=00010101=1+4+16=21,正确!

———————————————————————————————————————————
参考文章链接:https://blog.csdn.net/jiange_zh/article/details/47381115

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值