标题：二补数
二补数
最大优点是可以在加法或减法处理中，不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有号数加法，而且减法可以用一个数加上另一个数的二补数来表示，因此只要有加法电路及二补数电路即可完成各种有号数加法及减法，在电路设计上相当方便。
另外，二补数系统的 0 只有一个表示方式，这点和一补数系统不同（在一补数系统中，0 有二种表示方式），因此在判断数字是否为 0 时，只较比对一个不同的条件即可。表格下表是在一些 8 位二补数系统的整数。 
符号01111111=12700000010=200000001=100000000=011111111=−111111110=−210000001=−12710000000=−128
数字表示方式
说明二补数十进制0111701106......0010200011000001111−11110−2......1001−71000−8以下用 4 位的二补数数字来说明二补数系统的数字表示方式。 
·在表示正数和零时，二补数数字和一般二进制一样，唯一的不同是在二补数系统中，正数的最高位恒为 0，因此4 位的二补数正数，最大数字为 0111 (7)。 
·二补数数字的负数，最高位恒为 1，4 位二补数的数字中，最接近 0 的负数为 1111 (-1)，以此类推，因此绝对值最大的负数是 1000 (-8)。
以上的表示方式在电脑处理时格外方便，以下用以下的例子说明： 
0011 (3)
+ 1111 (-1)
--------------
10010 (2)
结果 10010 似乎是错的，因为已经超过四个位，不过若忽略掉（从右数起的）第 5 个位，结果是 0010 (2)，和我们计算的结果一样。而且若可以将二进制的 0001 (1) 变号为 1111 (-1)，以上的式子也可以计算减法：3-1 = 2。
在 n 位的二补数加减法中，忽略第 n+1 个位的作法在各种有号数加法下都适用（不过在判断是否溢出(overflow)时，仍然会用到第 n+1 个位）。因此在二补数的系统，加法电路就可以处理有负数的加法，不需另外处理减法的电路。而且，只要有电路负责数字的变号（例如将 1 变换为 -1），也可以用加法电路来处理减法。而数字的变号就用计算数字的二补数来完成。
在一般 n 位的二进制数字中，最高有效位(MSB) 第 n 位代表的数字为　2^(n-1)。不过，在 n 位的二补数系统中，最高有效位(MSB) 第 n 位表示符号位，若符号位为 0，数字为正数或 0，若符号位为 1，数字为负数。以下是 n 位的二补数系统中，几个特别的数字二补数实际数字附注0 111....1112^(n-1)-1最大正数......0 000....00110 000....00001 111....111-1......1 000....001-2^(n-1)-11 000....000-2^(n-1)绝对值最大负数因此，在 8 位的二补数系统中，可以表示的最大正数为 2^(8-1)-1 = 127，可以表示的最大绝对值负数为 -2^(8-1) = -128计算二补数在计算二进字数字的二补数时，会将数字进行位元反相运算，再将结果加 1，不考虑溢位位元（一般情形，溢位位元会为 0），就可以得到该数字的二补数。 
以下考虑用有号数 8 位元二进位表示的数字 5： 
0000 0101 (5) 
其最高位元为 0，因为此数字为正数。若要用二补数系统表示 -5，首先要将 5 的二进位进行反相运算〔1 变为 0，0 变为 1 〕： 
1111 1010 
目前的数字是数字 5 的一补数，因此需要再加 1，才是二补数： 
1111 1011 (-5) 
以上就是在二补数系统中 -5 的表示方式。其其最高位元为 1，因为此数字确实为负数。 
一个负数的二补数就是其对应的正数。以 -5 为例，先求数字的一补数： 
0000 0100 
再加一就是 -5 的二补数，也就是 5。 
0000 0101 (5) 
简单来说，数字 a (正负数皆可)的二补数即为 -a。 
若要计算 n 位数二补数二进位对应的十进位，需要知道每位数对应的数字，除了最高位元外，其他位元的对应数字均和一般二进位相同，即第 i 位数表示数字 2i−1。但最高位元若为 1 时，其表示数字为 -2n−1，因此若用此方式计算 0000 0101 表示的数字，其结果为： 
1111 1011 (−5) = −128 + 64 + 32 + 16 + 8 + 0 + 2 + 1 = (−2^7 + 2^6 + ...) = −5特别的数字有二个数字的二补数等于本身：一个是 0，另一个为该位元可表示最大绝对值负数（即 1000...000）。 
0 的二补数计算方式(以 8 位元为例) 如下：先计算它的一补数： 
1111 1111 
再将一补数加一： 
0000 0000, 溢位位元 = 1 
忽略溢位，其结果为 0（0 是唯一计算二补数过程中会出现溢位的数字。）。因此 0 的二补数为 0。而 0 x -1 = 0，因此其二补数仍满足「数字 a 的二补数为 -a」的原则。 
若计算 1000 0000 （-128、8 位元可表示最大绝对值负数）的二补数：先计算它的一补数： 
0111 1111 
再加一就是它的二补数。 
1000 0000 
1000 0000 (-128)的二补数仍为 1000 0000 (-128)。但 -128 x -1 = 128，因此其二补数是以上规则的例外。 
其例外原因为因为 8 位元的二补数数字范围为 -128 ~ 127。128 无法以 8 位元的二补数数字表示。在计算其他位数的最大绝对值负数（即 1000...000）时，也会有类似情形。其他计算二补数的方法另一种正式计算一数字(此例中以 N 为例)的二补数 N* 的公式如下： 
&lt;math&gt;N* = 2^n - N&lt;/math&gt; 
其中 N* 是 N 的补数，而 n 是数字 N 用二进位表示时需要的位数。 
以 4 位数二进位 的 5 为例： 
N (十进位) = 5, N (二进位) = 0101 
n = 4 
5 的二补数计算方式如下： 
&lt;math&gt;N* = 2^n - N = [2^4](base 10) - 0101 = 10000(base 2) - 0101 = 1011&lt;/math&gt; 
以另一种较简单的方式，可以找出二进位数字的二补数： 
先由最低位元开始找。 
若该位元为 0，将二补数对应位元填 0，继续找下一位元(较高的位元)。 
若找到第一个为 1 的位元为 0，将二补数对应位元填 1。 
将其馀未转换的位元进行位元反相，将结果填入对应的二补数。 
以 0011 1100 为例（图中的 ^ 表示目前转换的数字，-表示还不确定的位数）： 
原数字 二补数 0011 1100 ---- ---0 (此位元为 0) ^ 0011 1100 ---- --00 (此位元为 0) ^ 0011 1100 ---- -100 (找到第 1 个为 1 的位元) ^ 0011 1100 1100 0100 (其馀位元直接反相) ^
因此其结果为 1100 0100符号延展十进位 4 位元二补数 8 位元二补数 
5 0101 0000 0101 
-3 1101 1111 1101 
将一个特定位元二补数系统的数字要以较多位元表示时（例如，将一个位元组的变数复制到另一个二个位元组），所有增加的高位元都要填入原数字的符号位元。在一些微处理机中，有指令可以执行上述的动作。若是没有，需要自行在程式中处理。 
在二补数系统中，当数字要向右位移几个位元时，在位移後需将符号位元再填入原位置，保持符号位元不变。以下是二个例子： 
数字 0010 1010 1010 1010 向右位移一次 0001 0101 1101 0101 向右位移二次 0000 1010 1110 1010
而当一个数字要向左位移几个位元时，最低位元填 0，而符号位元不受位移影响。以下是二个例子： 
数字 0010 1010 1010 1010 向左位移一次 0101 0100 1101 0100 向左位移二次 0010 1000 1010 1000
向右位移一次相当于除 2，向左位移一次相当于乘 2。利用上述的方式可以确保位移後的数字正负号和原数字相同，因为一数字乘 2 或除 2 後，不会改变其正负号。
计算
加法二补数系统数字的加法和一般加法相同，而且在运算完成後就可以看出结果的正负号，不需特别的处理。举例以 15 加 -5　为例： 
11111 111 (进位) 0000 1111 (15) + 1111 1011 (-5)=00001010 (10)
由于加数和被加数都是 8 位元，因此运算结果也限制在 8 位元内。第 8 位元相加後产生的进位不考虑（因为不存在第 9 位元）的 1 被忽略，所以其结果为 10。而 15 + (-5) = 10，计算结果正确。 
在以上计算式中，可以由进位列的最左侧二个位元得知结果是否出现溢位。溢位就是数字的绝对值太大，以致於无法在指定的二进位位元个数来表示（在此例中，是超过 8 位元的范围）。若进位列的最左侧二个位元同为 0 或同为 1，表示结果正确，若是一个为 0，另一个为 1，表示出现溢位错误。也可以对此二个位元进行XOR运算，结果为 1 时，表示出现溢位错误。以下以 7 + 3 的 4 位元加法说明溢位错误的情形。 
0111 (进位) 0111 (7) + 0011 (3) ============= 1010 (−6) 结果不正确！
在此例中，进位列的最左侧二个位元为 01，因此出现溢位错误。溢位的原因是 7 + 3 的结果 (10) 超过二补数系统 4 位元所可以表示的数字范围 -8~7。