源码、反码、补码

源码

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

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

反码

正数的反码等于它本身。
负数的反码等于在其源码的基础上,符号位不变,其余位取反。
00010000>取反>00010000
10010000>取反>11101111

 1.  00010000>取反>00010000
 2. 10010000>取反>11101111

补码

正数的补码等于它本身
负数的补码等于其反码加一
00010000>取反>00010000>取补>00010000
10010000>取反>11101111>取补>11110000
1. 00010000>取反>00010000>取补>00010000 2. 10010000>取反>11101111>取补>11110000

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

注2:负数补码加其源码等于0,因此二进制下补码可以直接进行二进制运算,得到的结果直接转化成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][11111111,01111111],即十进制的[−127,+127][−127,+127],而补码的是[−128,127][−128,127],因为补码的−128=−1+(−127)=10000001+11111111=10000000−128=−1+(−127)=10000001+11111111=10000000,在形式上就是二进制的1000000010000000,而原码的10000000=−010000000=−0,00000000=000000000=0,就浪费了一个数据

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值