基础知识了解:
在计算机内,整数的长度是肯定的,在字长为32位的计算机中,整数的长度就是32个二进制,这其中还包括了符号位(1表示正,0表示负)。这里面咱们为了方便描述,就假设机器字长为8位。编码
例如,十进制整数23,二进制真值表示为10111,其原码表示为 0001 0111。设计
十进制整数-23,二进制真值表示为-10111,原码表示为 1001 0111。源码
简而言之,源码就是最高位为符号位,其余位表示该数的绝对值数学
若是计算机内部采用原码表示数,那么在进行加法和减法运算的时候,最终都转化为两个绝对值的加运算和减运算,所以,在设计计算器的时候就既须要设计加法运算器,又要设计减法运算器(代价有点大,是否能够就用一种类型的运算器呢? 其实大多数人都喜欢作加法运算,不太喜欢用减法运算)。基础
补码的思想
咱们但愿只设计加法运算器,不用减法运算器,咱们但愿找到一种方案,采用这种方案作加运算 1 + ( -1 ) ,两个数能够直接根据二进制的加法规则作运算,获得0,而没必要作减法。扩展
用 0000 0000表示0是很天然的想法,用 0000 0001到 0111 1111表示1到127的正数,也是天然的想法,此时,最高位的0能够作符号标识,也能够当作普通的二进制位。
如今问题是:怎么表示-1呢?
咱们作一次逆向思惟,0000 0001加上什么样的二进制数能够获得0000 0000?即:从右向左思考,加数的最右边的最低位必须是1,根据二进制加法规则:1+1=0,进位为1。再考虑次低位,加数的次低位也必须是1,而后加上1得0进一位,...依次类推,加数的8为都必须是1,才能够获得8个0。问题是最后产生一个进位,即:0000 0001 + (1111 1111)= 1 0000 0000
这在数学上是不可接受的,可是在计算机中去恰好合适,由于在设计中,每一个数的长度是肯定的,因此不管结果最后是多少,都只保留8位,多余的位会被丢弃。所以,咱们能够将 1111 1111来表示-1,下面就是采用一种方式来合理的将-1怎么变成 1111 1111这种形式。
补码的定义:
带符号整数有原码、反码、补码等几种编码方式。原码即直接将真值转换為其相应的二进制形式,而反码和补码是对原码进行某种转换编码方式。正整数的原码、反码和补码都同样,负数的反码是对原码的除符号位外的其余位进行取反后的结果(取反即若是该位為0则变為1而该位為1则变為0操做)而补码是先求原码的反码,而后在反码的末尾位加1后获得结果,即补码是反码+1
补码就是最方便的方式。它的便利体如今,全部的加法运算可使用同一种电路完成。
以-8做为例子。假定有两种表示方法。一种是直觉表示法,即10001000;另外一种是2的补码表示法,即11111000。请问哪种表示法在加法运算中更方便?
随便写一个计算式,16 + (-8) = ?
16的二进制表示是 00010000,因此用直觉表示法,加法就要写成:
00010000
+10001000
---------
10011000
能够看到,若是按照正常的加法规则,就会获得10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种状况下,正常的加法规则不适用于正数与负数的加法,所以必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算作两种电路。
如今,再来看2的补码表示法。
00010000
+11111000
---------
100001000
能够看到,按照正常的加法规则,获得的结果是100001000。注意,这是一个9位的二进制数。咱们已经假定这是一台8位机,所以最高的第9位是一个溢出位,会被自动舍去。因此,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,2的补码表示法能够将加法运算规则,扩展到整个整数集,从而用一套电路就能够实现所有整数的加法。
补码的本质:
要将正数转成对应的负数,其实只要用0减去这个数就能够了。好比,-8其实就是0-8。
已知8的二进制是00001000,-8就能够用下面的式子求出:二进制
00000000
- 00001000
---------方法
由于00000000(被减数)小于0000100(减数),因此不够减。请回忆一下小学算术,若是被减数的某一位小于减数,咱们怎么办?很简单,问上一位借1就能够了。
因此,0000000也问上一位借了1,也就是说,被减数实际上是100000000,算式也就改写成:计算机
100000000
-00001000
---------
11111000
进一步观察,能够发现100000000 = 11111111 + 1,因此上面的式子能够拆成两个:
11111111
-00001000
---------
11110111
+00000001
---------
11111000
补码的两个转换步骤就是这么来的。(其中的 1111 1000 就是-8的补码,是由对 000 1000 取反获得111 0111 加1 最终获得 111 1000,最后加上符号位1就是1111 1000)。这就是补码计算规则的由来。di