原码 反码 补码

2 篇文章 0 订阅
2 篇文章 0 订阅

一摸鱼就是好久,主要最近学校期末了,开始各种交大作业,真的伤脑筋
这次就来哔哔一下原码 反码 补码这三兄弟吧
此时先定义一个数

int i = 1;

由于实在懒,就不取那么大的数了,1多好,简简单单
原码指的是一个数的二进制表示,那么1就是
00000000 00000000 00000000 00000001
但是,正数的原码 反码 补码都是一样的,所以。。。例子失败了

那就换个例子吧
如果此时给出一串二进制

11111111 11111111 11111111 11111110

这个数代表的是多少?

刚看到的人可能一看,哇,这么多的1,得算到啥时候去,其实不然
首先我们需要看的是第一位,也就是这个

11111111 11111111 11111111 11111110

在二进制中第一位如果是1就代表着是负数,如果是0就代表着正数,不会有人连这个都不知道吧,那你现在就知道咯

所以这个数其实是个负数,而在进行存储时,负数存储的其实是补码,所以为了知道这串二进制代表的真正是数字是多少,我们还需要把他变成原码才行,也就是说

11111111 11111111 11111111 11111110

是这个数的补码

那么怎么换成原码呢,这里讲一讲原码变成补码的步骤

首先原码要求反变成反码,随后由反码 +1 变成补码

感觉有点麻烦的亚子,可是为了c语言设计的方便,就把他设计成了只能进行加运算,负数也只能这么麻烦了,从某些意义上来讲还引起了不错的重视咧

但是这里要求的是原码,害,数学逆运算嘛

我们这串二进制是

11111111 11111111 11111111 11111110

那首先我们需要把他变成反码,反码变成补码是要 +1
那我们就 -1

11111111 11111111 11111111 11111110

-1


11111111 11111111 11111111 11111101

很简单的计算嘛,就是向前借一位,而二进制中前一位的 1 代表着 2 ,所以减完 1 前一位就是 0 ,后一位就是 1 了,逻辑想通了就特别简单,所以

11111111 11111111 11111111 11111101

就是这个数的反码

接下来再给这段二进制求反,你先求反得到了这个,那这个再求反就变回原来的亚子,没毛病吧

11111111 11111111 11111111 11111101

求反


10000000 00000000 00000000 00000010

注意哦,第一位可不能变的,那是代表着符号的位,不然一个负数就变成正数了

那此时再来看这个数,会发现这个数竟然只是一个小小的 -2 ,但是存储的时候存了个补码老多 1 了,即

10000000 00000000 00000000 00000010

是这个数的原码

总结一下
原码 (取反)→反码
反码(+1)→补码
负数在进行存储时存的是补码
正数的原码反码补码都是一样的
判断正负的时候需要看他二进制的第一位,是0就是正数,是1就是负数
在进行原码反码补码之间变化取反时第一位的数字是不变的(但是需要注意的是如果直接对数字取反如: ~-2 时符号位需要变化)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值