学习c语言,逃脱不了的就是编码,这篇博客就是来学习下计算机中的原码反码补码,首先就是原码,一开始计算机并不能表示正负,为了让计算机能够表示正负,人们发明了原码,原码的工作原理就是在数字前面再加上一位,用来表示正负,0表示正,1表示负。比如说2这个数字与-2这个数字,可以如如下的方法来表示(具体是多少位可以自己定或看计算机储存位数,2表示为0 010也是可以的,本博客按照总计7位表示):
2: 0 000010
-2: 1 000010
但是这样子表示也有一点问题,当几个通过原码表示的数字开始相加的时候,假如参与运算的都同为正数或都同为负数,那么没问题,但是假如参与运算的既有正数又有负数,那么就会出现问题,如下面所示
都为正数:2+2= 4. 0 000010+0 000010 = 0 000100 = 4
有正有负:2+-2=0. 0 000010+1 000010 = 1 000100 = -4 (不等于-2)
为了处理上面所展示问题 ,人们就发明了补码,但是要从原码转换到补码,先要将原码转换成反码。如下方所述
2 原码 0 000010. 反码 0 000010.
-2 原码 1 000010 反码 1 111101
接下来就是补码了,现在计算机大部分情况都是用补码来进行储存数据的。我们先讲如何将反码转化为补码:
对于正数:原码既是补码
2 补码 0 000010
对于负数:在反码位数后面加一就是补码。
-2 补码1 111110
然后两位数相加
2 + (-2) =0 000010 + 1 111110 = 10 0 0000
会发现多处来了几位,而在计算机中,多处来的那一位被舍去(溢出了,本博文采用7位来表示,所以舍弃最前面的第1位,),就可以计算出 2 + (-2) = 0 000000 =0
我们再计算其他的算式
比如说 37 + (-44)
原码 | 反码 | 补码 | |
37 | 0 100101 | 0 100101 | 0 100101 |
-44 | 1 101100 | 1 010011 | 1 010100 |
37 + (-44) = 0 100101 + 1 010100= 0 1 111001
舍去掉多出来的一位(原本我们在这篇博文中表示的总计7位)即为1 111001 ,将这个补码数字转化为原码,换算过来就是-7,计算完成
总结一下,上面讲述了原码,反码补码之间的运算以及转化,正数的补码就是其原码本身,而负数的原码是将其对应正数按位取反再加 1
补码的发明则是为了将计算机中的减法运算全部转换为加法运算,用来方便计算机运行