原码:以n位为例,最高位表示真值的符号位,0表示正号,1表示负号,剩下的n-1位对数字部分进行编码。如果数字部分不足n-1位,则在高位补零,补足n-1位。
注意,按照以上表示方法,0的表示方法有两种:+0=0000 0000;-0=1000 0000。
原码是对数值的直接表示,所以其简单直观,但是在进行加减法运算时,需要对符号位和数值等等绝对值大小进行判断,使得运算十分复杂。
补码:符号位与原码相同,0表示正数,1表示负数。数字部分与符号位相关,正数的数字部分与原码相同,负数的数字部分需要将原码的数字部分按位取反再加1。以补码转换原码时,也是按位取反再加1。
原码与补码的转换:x=+1101,y=-1110
原码:0000 1101,1000 1110
补码:0000 1101,1111 0010
以补码求原码:0000 1101,1000 1110
补码的表示范围:
在8位的位模式下,正数部分为0000 0000到0111 1111,即+0到+127,负数部分1000 0000到1111 1111。
我们需要对负数部分的补码进行转换,得到原码才能知道表示范围。
1000 0000的原码为1 1000 0000,即-128,1111 1111的原码为1000 0001,即-1。注意这里1000 0000的原码实际上是溢出了的。
所以8位的位模式下,补码的表示范围是[-128,127],或者[-128,128)。
对于n位的位模式,补码的表示范围是-2^(n-1)到2^(n-1)-1,一共2^n个数。
之所以要使用补码,因为补码可以简化运算,补码运算有下面两个公式:
(x+y)补=x补+y补(x-y)补=x补+(-y)补
这里只对第二个公式进行推导。
(x-y)补=(2^n+(x-y)) mod 2^n
=((2^n+x)+(2^n-y)) mod 2^n
=x补+(-y)补
例:A=+1011=11,B=+1110=14,求A-B
A补=0 1011,B补=0 1110,A补+(-B)补=0 1011+1 0010=1 1101=(A-B)补,则A-B=1 0011=-3
在进行补码运算时,符号位也参与运算,且不考虑符号位的进位问题,直接忽略掉进位。
例:A=+1111=15,B=-1101=-13,求A+B
0 1111+1 0011=10 0010,这里我们直接忽略最高位的1,结果变为0 0010=2
二进制的乘法运算与人们通常使用的十进制乘法运算有相似之处,分别使用乘数的各个数与被乘数相乘,最后结果相加,于是有:
例:1101*1011即13*11
1101+1101 0+0000 00+1101 000=1000 1111
所以二进制的乘法运算其实就是被乘数的移位与相加,这两个动作都可以使用加法器完成。
二进制的除法运算实际是除数的移位与相减,显然加法器是可以完成这两个动作的,这里不做解释。
至此,二进制的四则运算都已完成。