简单学习 原码反码补码 学会了你才是真正的程序员了

一、简单介绍原码反码补码

        首先我们需要知道的是原码反码补码是一个人为的行为,因为机器看的都是所谓的补码,这个反码只是作为补码的到原码也就是人能看懂的跳板,所以计算机无论是计算器里面的东西还是他底层运行的二进制代码都是补码,一定要记住只有原码是给人看的。

        再次强调一遍,只有原码是给人类看的,计算机看的是补码,而反码是跳板。

二、正数三码合一

        首先我们来看正数的二进制原码,我们就有8bit来看,也就是一个字节,在C语言里面那就是一个char,在java里面那就是一个byte的大小,当然我们算int也是可以扩充开来去看一样的,而且要记住的一点我们这里是有正负数的也就是说char的上限就是从[-128,127]的这么一个范围,然后int也就是[-2,147,483,648, 2,147,483,647],所以说我们的都是signed不是unsigned,是有符号的整型。

        然后我们根据我们的标题来看,三码合一,也就是三个码是一样的。

原码=反码=补码

我们看二进制的情况,比如我们先给定一个数字为8,那他的二进制,我们用8位和32位都展示一下。

0000 1000

0000 0000 0000 0000 0000 0000 0000 1000

这下大家应该能知道为什么要选择8位了吧,当然我们自然是可以作用在所有整型类型上的。

我们再来看一个比如说7。

0000 0111

然后根据我们正数的特性三码合一,也就是这个是原码但是又是补码和反码。

我们也可以查看一下计算器里面的程序员选项。

三、负数三码不同

1.原码

        既然正数是三码合一的,那负数呢,自然是不同的,负数我们有个所谓的符号位,在最左边,可以标记出是否为负数,也就是我们-7就是,原码就是正常的7然后符号位是有一位的。

1000 0111

这个就是-7的原码,但是大家不要急着用计算器去搞,因为弄不出来的,他给你显示的是补码。

2.反码

        既然名字都叫反码,所以我们的反码也是非常的简单的,就是翻转我们所有的位数除了符号位,也就是说-7的反码就是。

1111 1000

这个就是-7的反码,除了符号位之外翻转,我们细细看一下区别。

1000 0111        原码

1111 1000        反码

这个就是反码,但是反码只是跳板,最终我们要获取到补码才行。

3.补码

        补码就是反码+1,补码=反码+1,非常的简单,如此操作。

1111 1000        反码

1111 1001        补码

所以这个1111 1001就是我们-7的补码,也就是计算器里面显示的-7我们可以看一下。

相信大家现在已经会算负数了,然后我们再来一个训练,比如我们的1101 1101这个是补码,我们要获得原码应该如何计算呢?

是不是直接先-1变成反码然后再除了符号位翻转然后我们就可以读出这个是什么了。

1101 1101        补码

1101 1100        反码

1010 0011        原码

符号位变成负号,-35。

大家如果想验证最后变出来的原码是否为正确,除了直接算之外,也可以使用计算器,我们掐掉符号位,再丢入计算器里面的位数即可获得正确答案。

然后我们就会算负数了,这下我们就可以进行位运算了。

四、位运算

我们位运算顾名思义就是每个位进行运算。

1.与运算

与运算的口诀是全一出一,有0出0,可以简单理解为乘法,符号是&记住是&而不是&&,两个&的短路与,不是正常的与运算。

1&1=1

1&0=0

0&1=0

0&0=0

比如我们来个15 & 7那他的答案就是。

0000 1111

0000 0111 &

0000 0111

答案也就是7,大家可以自己用编程语言测试一下。而且不要忘记了这里的运算的15和7已经变成了补码,而且计算出来的结果也是补码。

我们再来一个,-15&7。

1000 1111        -15原

1111 0000        -15反

1111 0001        -15补

0000 0111 &     7原=7反=7补

0000 0001        1补=1反=1原

所以答案就是1。

假如我们再来一个,-15&-8。

1000 1111        -15原

1111 0000        -15反

1111 0001        -15补

1000 1000        -8原

1111 0111         -8反

1111 1000         -8补

1111 0001 &     -15补

1111 0000        ?补

1110 1111        ?反

1001 0000        -16原

2.或运算

或运算的口诀就是有一出一,没一出零,符号是|两个是短路或。

1|1=1

1|0=1

0|1=1

0|0=0

会了与运算之后或运算也和明了了,比如来个-15|7和6|3

1111 0001        -15补(因为前面一直用的15相信大家也会算了,所以这里直接用补码)

0000 0111 |      7补=7反=7原

1111 0111        ?补

1111 0110        ?反

1000 1001        -9原

0000 0110        6补=6反=6原

0000 0011 |      3补=3反=3原

0000 0111        7补=7反=7原

3.异或运算

异或运算则是不同出1,相同出0,符号是^。

1^1=0

1^0=1

0^1=1

0^0=0

那我们就随便来一个继续-15 ^ 2。

1111 0001        -15补

0000 0010 ^     2补=2反=2原

1111 0011        ?补

1111 0010        ?反

1000 1101        -13原

4.非运算(取反)

顾名思义就是取反操作,符号是~,这个是不需要多个进行运算的,就是单纯的所有位数翻转我们继续以-15举例

1000 1111        -15原

1111 0000        -15反

1111 0001        -15补

取反之后

0000 1110        14补=14反=14原

所以答案就是14。

五、总结

不要忘记计算机所有的运算都是建立在补码的过程上的,所以要进去运算的也是补码,运算出来的也是补码,计算器里面显示的也是补码,你想要变成我们人类自己定义的原码,那就得进行上述的转换。

如果对你有帮助的话不要忘记点赞收藏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值