源码,补码与反码

本次中心内容的前决知识

1.数据单位

<1>bit,比特,计算机中最小的数据单位

<2>B,字节,相当于8位二进制数(8个bit)

<3>其他单位(从小到大,相邻单位进率为2的10次方):KB,MB,GB,TB,PB,EB,ZB,YB,NB,DB,CB

2.机器数:

一个数在计算机中的二进制数表示形式

注:机器数的最高位是符号位,故机器数在形式上(真值)不等于其二进制数值

3.真值:

带符号位的机器数的形式值

源码

数值的符号位加上其真值的绝对值,范围是[-127,127],也就是二进制的[11111111,01111111]

(记住,单个字节是8个bit,首位是符号位)

反码

正数的反码等于它本身。

负数的反码等于在其源码的基础上,符号位不变,其余位取反。

   00010000>取反>00010000
   10010000>取反>11101111

补码

正数的补码等于它本身

负数的补码等于其反码加一

   00010000>取反>00010000>取补>00010000
   10010000>取反>11101111>取补>11110000

:源码可以直接转化为10进制数(注意符号位),补码不能直接转化为10进制

注2:负数补码加其源码等于0,因此二进制下补码可以直接进行二进制运算,得到的结果直接转化成10进制就是答案


update:2019.10.10

建议将上面的源码,补码,反码的定义和计算方式记牢用熟后再看下面的,以免结构层次混乱


这三个概念是比较重要的,接下来我们说一下它们到底是干什么的

首先确定,源码,反码和补码都是在计算机中表示数的方式

但这时问题就出来了,既然已经有了源码,要反码和补码干甚?

想一下,当两个用源码表示的数进行加或减运算,电脑还要判断是加法还是减法,还要判断是正数还是负数,两个字,麻烦

而且如果直接让源码相加,加出来的数是个什么你都不知道

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

但如果用反码,就可以让符号位直接参与加减,同样减去一个数等于加上其相反数,那么判断正负和加减这两个步骤就减去了

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

这样的话,就可以方便的计算出结果

但反码的0就会有1000 0000和0000 0000两种表示方法,于是就出现了补码

8位2进制下源码表示的数据范围是 [ 11111111 , 01111111 ] [1111 1111,0111 1111] [11111111,01111111],即十进制的 [ − 127 , + 127 ] [-127,+127] [127,+127],而补码的是 [ − 128 , 127 ] [-128,127] [128,127],因为补码的 − 128 = − 1 + ( − 127 ) = 10000001 + 11111111 = 10000000 -128=-1+(-127)=1000 0001+1111 1111=1000 0000 128=1+127=10000001+11111111=10000000,在形式上就是二进制的 10000000 1000 0000 10000000,而原码的 10000000 = − 0 1000 0000=-0 10000000=0 00000000 = 0 0000 0000=0 00000000=0,就浪费了一个数据

因此,用补码可以解决效率问题,还可以多一个内存空间,这就是计算机里保存数据为什么要用补码而非源码(反码实质上只是一个过渡)


既然上文已经说了,补码是二进制运算的工具,源码是十进制与二进制的桥梁,那么补码的运算有什么规律?

补码加法

[x]补+[y]补=[x+y]补

补码减法上文已经提到过转换方式

补码乘法

补码的乘法不具备 [ X ∗ Y ] 补 = [ X ] 补 × [ Y ] [X*Y]补=[X]补×[Y] [XY]=[X]×[Y]补的性质。但是 [ X ∗ Y ] 补 = = [ X ] 补 × Y [X*Y]补==[X]补×Y [XY]==[X]×Y,所得结果再取补码,如 x = 101 , y = 011 , [ x ∗ y ] 补 = − [ ( − 101 ) ∗ 011 ] = − [ 011 ∗ 011 ] = − 01001 = 10111 x=101,y=011,[x*y]补=-[(-101)*011]=-[011*011]=-01001=10111 x=101,y=011,[xy]=[(101)011]=[011011]=01001=10111


正数与负数的二进制关系

负数的二进制=其绝对值二进制的反码加一
(当然,负数的符号位该是多少就是多少)

本文的核心来自: 源码补码与反码详解

一些例题:

在8位2进制补码中,10101011表示的数是十进制下的()

A 43

B -85

C -43

D -84

(noip2017初赛第2题)

解析:

补码=源码的反码加1,故我们可以推出源码为11010101,转化为十进制为

− ( 2 0 + 2 2 + 2 4 + 2 6 ) = − ( 1 + 4 + 16 + 64 ) = − 85 -({2}^{0}+{2}^{2}+{2}^{4}+{2}^{6})=-(1+4+16+64)=-85 (20+22+24+26)=(1+4+16+64)=85

选B

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AndrewMe8211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值