深入浅出:原码,反码,补码及减法

众所周知(我不说大家也知道),计算机内部是以二进制存储数据的,对于不同的类似可能存储的格式含义不一样。例如有符号整数,最高位是符号位,其余代表数值;那么它在计算机里要怎么运算表达呢,我们下面来一步步说一下

  1. 举个例子,1+1怎么表达呢?
    1的二进制表达为(为了方便用1个字节表示):00000001
    那么1+1即表达为:00000001 + 00000001 = 00000010 = 2
    是吧,这样子是对的,so easy。

  2. 再接着看下面,2-1怎么表达呢?
    2的二进制为:00000010
    -1的二进制为:10000001
    那么:2-1=2+(-1)=00000010+10000001=10000011=-3
    等等!怎么不是1呢?这不是我认识的减法啊!
    其实呢,是因为计算机在计算过程中并不是用我们认识的二进制来表达运算的。
    我们认识直接转换的二进制呢,是称为:原码。
    计算机内部采用补码来计算的。我们先来说什么说原码和补码吧

  3. 什么是原码
    维基百科的定义:原码(True form)是电脑运算的名词,是指“未经更改”的码。例如上面举的例子,2的二进制表达为00000010,00000010即是原码。

  4. 什么是补码
    维基百科的定义:补码(英语:2’s complement)是一种用二进制表示有号数的方法。
    补码是根据原码规则计算而来的:
    正数和0的补码:该数字本身。
    负数的补码:将其除最高位(即符号位)取反再加1得出的。
    那么什么是取反,0变成1,1变成0就是取码了。
    举个例子,-1,原码是:10000001
    第一步,除最高位取反,得到:11111110
    第二步,加1:11111111
    最后-1的补码即为:11111111
    对了,在转换补码的过程中,还有步骤:取反。取反得出来的数,称为反码。

  5. 什么是反码
    反码是一种在计算机中数的机器码表示。对于单个数值(二进制的0和1)而言,对其进行取反操作就是将0变为1,1变为0
    反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。
    反码是在原码和补码转换过程中过渡的一种运算而已。知道了原码和补码的转换,其实也就知道什么是反码了,只是把它抽象出来了。

  6. 减法到底是怎么做呢?
    说完了原码,反码和补码,回到最开始的问题,到底怎么运算才对啊?个位数都算错可丢人了。
    计算机内部采用补码来计算的。
    i. 首先我们要把需要计算的转换成补码
    2的原码是:00000010,由于是正数,补码即为本身:00000010。
    -1的原码是:10000001,由于是负数,补码为:11111111
    ii. 计算机内部是采用补码加法,统一了运算规则。例如把2-1看成是:2+(-1)。于是2-1实际为:
    00000010 + 11111111 = 00000001 = 1
    iii. 最终计算结果是正常的,对得起学过的小学数学了。

  7. 究极原因:为什么非要被码?
    在我阅读和思考的时候,很多思想是通过时钟循环来表达其本质。
    我个人理解为公式的变换,相对容易理解。怎么说呢?我们推导一下下面的公式。
    10-8=10+(-8)=10+(-1-8)+1=10+[(-1-8)+1]
    来到这里,我们停一下。这个公式推导过来是等价的,看看方括号里面是不是和计算机内部计算取反+1很相似?
    -1是二进制是:11111111,-8的原码是:10001000,反码是:11110111,-1-8除开高位的运算为:1111111-0001000=1110111,结合高位即为:11110111,即就是取反的结果。
    方括号里的实质即是[(取反)+1]=[补码],这就是为什么可以使用补码计算了。这个原因纯粹个人理解分析,为了更好的理解补码运算,希望也能帮助到你。

你可能感兴趣的:(计算机基础,原码,反码,补码,计算机减法)