提升补充内容——补码

目录

补码:

机器数和真值

机器数:

真值:

回忆:

补码1

补码2

思考一下

下期预告:C语言的陷阱和改进

 今天我们来说一说关于补码的事。还记得我们在位运算符那里文章提到的位取反运算符吗,在那个地方我留下了一个坑,现在就然后我们填上它。

补码:

首先对于补码我们要知道的是这是一种让计算机明白有符号数的一种方式,有符号的数又是分为两种:一种是五符号的数,一种是有符号的数。无符号的数最好办,就是正数;而有符号的数就是带负号的数,一般而言我们都知道正数要比负数好计算,所以我们设计计算机语言的时候就会刻意避免计算到有符号的数,所以我们制定了一种规则来让计算负数的时候可以同样采用正数的计算方法来计算,提高效率,这种规则就叫做补码。而且补码是关于整型数的规则,浮点数有其独立的规则,但是目的都是一样的。

机器数和真值

机器数:

一个数在计算机中的二进制表示形式,就叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1.

比如:十进制数 +3,就是00000000000000000000000000000011

            十进制数 -3,就是1000000000000000000000000000011

实际上这个真正的表达式是:11111111111111111111111111111101 

至于为什么是上面的那样我们向下看,等学了补码的规则再回来看就会清楚了。

真值:

真正的数学意义上的数值。

因为第一位是符号位,所以机器数的形式值不等于真正的数值:

00000000000000000000000000000011->3

11111111111111111111111111111101 ->-3

真正的数值表示出来应该是三十二位,但现在由于31位是符号所以不是真值。

回忆:

还记得一个整型数需要几个字节吗?是四个字节也就是32位,一个字节是八位

 

补码1

  上面的两张图就是补码的规则,我们先看无符号的部分:还记得我在一开始提到的二进制转换为十进制的方法吗(不懂的看我往期内容),这个无规则就是我当时说的方法,不懂的话其实看图也是可以自己摸索出来的。然后就是有符号的数的规则:这个公式其实就只是将一个数的首位加上符号,剩下的继续无符号的计算方法就行。是不是很好理解,这就是补码规则,而且只是整型数的规则。

然后你看两张图开头的两个实例:是不是不管有无符号只要首位是0那么结果就是正数,后两个例子说明正负与首位是否为一有关。且由于规则不同,两个相同的二进制数表达的十进制数也是不同的。 

看到这你再看开头提到的那个实例,是不是发现还是不一样。这就引出了补码的第二种方法。


补码2

对于整数我们直接按位计算(利用上面的方法)

对于负数:保留符号位,对后面每位取反且加一。

0001->2^0=1

0101->2^2+2^0=5(两个为零的部分不再写出)

1011->保留负号,011按位取反->100+1->101->2^2+2^0=5;则结果是-5。

1111->保留负号,111按位取反->000+1->001->2^0=1;则结果是-1。

你懂了吗?其实就是代表符号的那一位按兵不动,后面地几位取反然后加一,算出后面几位的十进制数的结果然后加上符号就可以了;从头到尾代表符号的那位一直不参与计算。

这下明白开头实例的过程了吧,这就是补码。


思考一下

还有有人可能会说那么对于二进制数1000这个有符号数的结果怎么算呢?

首先还是代表符号位的1不动,将001取反变成111+1然后就变成1000,结果就是-8。有点意思是吧,其实还是上面的规则运用罢了。前面一切都正常,至于后面还会变成1000,那是因为二进制逢二进一,111+1->1000。而开头的那个符号位的1是没有参与计算的,所以结果是-8。

这就是补码的规则,你学会了吗,这下之前位运算符里的例子也就能懂了。我这只是浅显易懂的语言解释补码,但是这样严谨性就会下降,所以感兴趣的同学还是推荐看一看严谨的讲解,还会从中接收到新的知识。

🆗到这里就结束了,求个免费的赞。

下期预告:C语言陷阱躲避

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值