标题：补码
补码概述
计算机中的符号数有三种表示方法，即原码、反码和补码。它们均由符号位和数值部分组成，符号位的表示方法相同，都是用1表示“负”，用0表示“正”。
求补码
求给定数值的补码分以下两种情况：　正数的补码与原码相同。
【例1】+9的补码是00001001。（备注：这个+9的补码说的是用8位的2进制来表示补码的，补码表示方式很多，还有16位2进制补码表示形式，以及32位2进制补码表示形式等。）负数的补码负数的补码等于其源码的符号位不变，数值部分的各位取反，然后整个数加1。
同一个数字在不同的补码表示形式里头，是不同的。比方说-15的补码，在8位2进制里头是11110001，然而在16位2进制补码表示的情况下，就成了1111111111110001。在这篇补码概述里头涉及的补码转换默认把一个数转换成8位2进制的补码形式，每一种补码表示形式都只能表示有限的数字。
【例2】求-7的补码。
因为给定数是负数，则符号位为“1”。
后七位：-7的原码（10000111）→按位取反（11111000）（负数符号位不变）→加1(11111001)
所以-7的补码是11111001。
注：数0的补码表示是唯一的：
+0的补码=+0的反码=+0的原码=00000000
-0的补码=11111111+1=00000000（mod 2的8次方）应用已知一个数的补码，求原码的操作分两种情况：
⑴如果补码的符号位为“0”，表示是一个正数，其原码就是补码。
⑵如果补码的符号位为“1”，表示是一个负数，那么求给定的这个补码的补码就是要求的原码。
再举一个例子：求-64的补码
+64：01000000
10111111+1
11000000
【例3】已知一个补码为11111001，则原码是10000111（-7）。
因为符号位为“1”，表示是一个负数，所以该位不变，仍为“1”。
其余七位1111001取反后为0000110；
再加1，所以是10000111。
模
在“闲扯原码、反码、补码”文件中，没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模”
的概念：
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器，它也有一个计量范
围，即都存在一个“模”。例如：
时钟的计量范围是0～11，模=12。
表示n位的计算机计量范围是0～2^(n)-1，模=2^(n）。
“模”实质上是计量器产生“溢出”的量，它的值在计量器上表示不出来，计量器上只能表示出模的
余数。任何有模的计量器，均可化减法为加法运算。
例如：假设当前时针指向10点，而准确时间是6点，调整时间可有以下两种拨法：
一种是倒拨4小时，即：10-4=6 
另一种是顺拨8小时：10+8=12+6=6 
在以12模的系统中，加8和减4效果是一样的，因此凡是减4运算，都可以用加8来代替。
对“模”而言，8和4互为补数。实际上以12模的系统中，11和1，10和2，9和3，7和5，6和6都有这个特
性。共同的特点是两者相加等于模。
对于计算机，其概念和方法完全一样。n位计算机，设n=8， 所能表示的最大数是11111111，若再
加1称为100000000(9位），但因只有8位，最高位1自然丢失。又回了00000000，所以8位二进制系统的
模为2^8。在这样的系统中减法问题也可以化成加法问题，只需把减数用相应的补数表示就可以
了。把补数用到计算机对数的处理上，就是补码。
另外两个概念
一的补码（one's complement) 指的是正数=原码，负数=反码
而二的补码（two's complement) 指的就是通常所指的补码。
小数补码求法：一种简单的方式，符号位保持1不变，数值位从右边数第一个1及其右边的0保持不变，左边按位取反。补码的绝对值（称为真值）【例4】-65的补码是10111111
若直接将10111111转换成十进制，发现结果并不是-65，而是191。
事实上，在计算机内，如果是一个二进制数，其最左边的位是1，则我们可以判定它为负数，并且是用补码表示。
若要得到一个负二进制数的真值（原来的数值），只要将除符号位的各位取反，再加1，就得到真值。
如：二进制值：10111111（-65的补码）
各位取反（除符号位）：11000000
加1：11000001（-65）
代数加减运算
1、补码加法[X+Y]补 = [X]补 + [Y]补 
【例5】X=+0110011,Y=-0101001，求[X+Y]补 
[X]补=00110011 [Y]补=11010111 
[X+Y]补 = [X]补 + [Y]补 = 00110011+11010111=00001010 
注：因为计算机中运算器的位长是固定的，上述运算中产生的最高位进位将丢掉，所以结果不是 
100001010，而是00001010。2、补码减法[X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补 
其中[-Y]补称为负补，求负补的方法是：负数的绝对值的原码所有位按位取反；然后整个数加1。（恢复本来解释。请路人真正理解并实际验证后再修改。以免误导大众。另外，例6不具典型性，新增例7。）
【例6】1+（-1) [十进制]
1的原码00000001 转换成补码：00000001
-1的原码10000001 转换成补码：11111111
1+（-1)=0
00000001+11111111=00000000
00000000转换成十进制为0
0=0所以运算正确。
【例7增】-7-（-10) [十进制]
-7的补码：11111001
-10的补码：11110110
-（-10）：按位取反再加1实际上就是其负值的补码，为00001010
-7 - （-10)= -7 + 10 = 3
11111001+00001010 = 00000011
转换成十进制为33、补码乘法补码的乘法不具备【X*Y】补=【X】补×【Y】补的性质。但是【X*Y】补==【X】补×Y
其中，若【Y】补=y31y30……y0，则 Y=-y31*2^31+y30*2^30+……+y0*2^0
代数解释
任何一个数都可以表示为-a=2^(n-1)-2^(n-1)-a;
这个假设a为正数，那么-a就是负数。而根据二进制转十进制数的方法，我们可以把a表示为：a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2），第（n-1）位为符号位不计算在内。
这里k0,k1,k2,k(n-2）是1或者0，而且这里设a的二进制位数为n位，即其模为2^(n-1），而2^(n-1）其二项展开是：1+2^0+2^1+2^2+……+2^(n-2），而式子：-a=2^(n-1)-2^(n-1)-a中，2^(n-1)-a代入a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2）和2^(n-1)=1+2^0+2^1+2^2+……+2^(n-2）两式，2^(n-1)-a=(1-k(n-2))*2^(n-2)+(1-k(n-3))*2^(n-3)+……+(1-k2)*2^2+(1-k1)*2^1+(1-k0)*2^0+1，而这步转化正是取反再加1的规则的代数原理所在。因为这里k0,k1,k2,k3……不是0就是1，所以1－k0,1-k1,1-k2的运算就是二进制下的取反，而为什么要加1，追溯起来就是2^(n-1）的二项展开式最后还有一项1的缘故。而-a=2^(n-1)-2^(n-1)-a中，还有-2^(n-1）这项未解释，这项就是补码里首位的1，首位1在转化为十进制时要乘上2^(n-1），这正是n位二进制的模。
不能贴公式，所以看起来很麻烦，如果写成代数式子看起来是很方便的。
注：n位二进制，最高位为符号位，因此表示的数值范围-2^(n-1) ——2^(n-1) -1，所以模为2^(n-1）。上面提到的8位二进制模为2^8是因为最高位非符号位，表示的数值范围为0——2^8-1。