原码、反码与补码知识讲解

2.2 原码、反码与补码

在计算机内的数(称之为“机器数”)值有3种表示法:原码、反码和补码。所谓原码就是带正、负号的二进制数,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。由此可见,这三种表示法中,关键是负数的表示方式不一样。

2.2.1 正负数表示、定点数与浮点数

在计算机内,通常把1个二进制数的最高位定义为符号位,用“0”表示正数,“1”表示负数;其余位表示数值。

规定小数点位置固定不变的数称为“定点数”;小数点的位置不固定,可以浮动的数称为“浮点数”。

2.2.2 原码

原码表示法是定点数的一种简单的表示法。用原码表示带符号二进制数时,符号位用0表示正,1表示负;数值位保持不变。原码表示法又称为符号-数值表示法。

1. 小数原码表示法

设有一数为x,则原码表示可记作[x]原(下标表示)。例如,X1= +1010110 ;X2= -1001010

原码表示数的范围与二进制位数有关。设二进制小数X=±0.X1X2…Xm,则小数原码的定义如下:

例如:X=+0.1011时, 根据以上公式可得[X]原=0.1011;X=-0.1011时,根据以上公式可得[X]原= 1-(-0.1011)=1.1011=1.1011

当用8位二进制来表示小数原码时,其表示范围为:最大值为0.1111111,其真值约为(0.99)10 ;最小值为1.1111111,其真值约为(-0.99)10。根据定义,小数“0”的原码可以表示成0.0…0或1.0…0。

2. 整数原码表示法 整数原码的定义如下:

例如:X=+1101时,根据以上公式可得[X]原=01101;X=-1101时,根据以上公式可得[X]原=24-(-1101)=10000+1101=11101

当用8位二进制来表示整数原码时,其表示范围为:最大值为01111111,其真值为(127)10 ;最小值为11111111,其真值为(-127)10 。同样,整数“0”的原码也有两种形式,即00…0和10…0。

2.2.3 反码

用反码表示带符号的二进制数时,符号位与原码相同,即用0表示正,用1表示负;数值位与符号位相关,正数反码的数值位和真值的数值位相同;而负数反码的数值位是真值的数值位按位变反。

1. 小数反码表示法

设二进制小数X=±0.x1x2…xm,则其反码定义为:

例如,X=+0.1011时,根据以上公式可得[X]反=0.1011;当X=-0.1011时,根据以上公式可得[X]反=2-2-4+X=10.0000-0.0001-0.1011=1.0100。根据定义,小数“0”的反码有两种表示形式,即0.0…0和1.1…1。

2. 整数反码表示法

设二进制整数X=±Xn-1Xn-2…X0,则其反码定义为:

例如,X=+1001时,根据以上公式可得[X]反 = 01001;当X=-1001时,根据以上公式可得[X]反 = (25-1)+X= (100000-1)+(-1001)= 11111-1001=10110 同样,整数“0”的反码也有两种形式,即00…0和11…1。

采用反码进行加、减运算时,无论进行两数相加还是两数相减,均可通过加法实现。加、减运算规则如下:

[X1+X2]反 =[X1]反 +[ X2]反 [X1-X2]反 =[X1]反 +[-X2]反

运算时符号位和数值位一样参加运算。当符号位有进位时,应将进位加到运算结果的最低位,才能得到最后结果。

2.2.4 补码

用补码表示带符号的二进制数时,符号位与原码、反码相同,即用0表示正,用1表示负;数值位与符号位相关,正数补码的数值位与原码、反码相同。而负数补码的数值位是真值的数值位按位变反,并在最低位加1。

1. 小数补码的定义

设二进制小数X=±0.X-1X-2…X-m,则其补码定义为:

例如,X= + 0.1011时,根据以上公式可得[X]补= 0.1011;X = - 0.1011时, 根据以上公式可得[X]补 = 2 + X = 10.0000 - 0.1011 = 1.0101

小数“0”的补码只有一种表示形式,即0.0…0。 2. 整数补码表示法

设二进制整数X=±Xn-1Xn-2…X0,则其补码定义为:

例如,X = +1010时,根据以上公式可得[X]补 = 01010;X = -1010时,根据以上公式可得[X]补 = 25+ X = 100000-1010 = 10110。同样,整数“0”的补码也只有一种表示形式,即00…0。采用补码进行加、减运算时,可以将加、减运算均通过加法实现,运算规则如下:

[X1 + X2]补 =[X1]补 +[X2]补 [X1 - X2]补 =[X1]补 +[-X2]补

运算时,符号位和数值位一样参加运算,若符号位有进位产生,则应将进位丢掉后才得到正确结果。例如,若X1 = -1001,X2 = +0011,则采用补码求X1-X2

的运算如下:[X1-X2]补=[X1]补+[-X2]补= 10111+11101。即:[X1-X2]补= 10100 。因符号位为1,表示是负数,故X1-X2 = -1100

2.2.5 模

“模”是指一个计量系统的计数范围。如时钟中的一个小时就是60分钟,这个60分钟就是“模”。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。表示n位的计算机计量范围是0~2n-1,模=2n。即n位二进制所能表示的无符号整数的范围:0≤x≤2n-1;n位二进制所能表示的有符号整数的范围:-2n-1+1≤x≤2n-1-1;n位二进制补码所能表示的数值范围为:-2n-1≤X≤+2n-1-1。

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。 对于计算机,模也就是相应位数寄存器所能表示的最大数再加1。如8位寄存器所能存储的数是11111111=255,这样8位寄存器的模就等于255+1=256。

2.2.6 BCD码、阶码与移码 1. BCD码

BCD编码将一个字节的8个位拆分成高4位和低4位两个部分,也就是说一个字节能存储两个数字。所以BCD的编码过程就是将数字压缩的过程,将两个字节的数字压缩成一个字节。反之,解码就是把一个字节的数字拆分为两个数字单独存放(大部分的处理都是按字节处理的)。

2. 阶码

对于任意一个二进制数n,可用N=S x 2P表示,其中S为尾数,P为阶码,2为阶码的底,P、S都用二进制数表示,S表示N的全部有效数字,P指明小数点的位置。

3. 移码

浮点数的阶码表示指数大小,有正有负,为避开阶码的符号,对每个阶码都加上一个正的常数(称偏移常数),使能表示的所有阶码都为正整数,变成“偏移”了的阶码,又称“增码”。

2.3 二进制的运算 2.3.1 二进制的四则运算

二进制数与十进制一样,同样可以进行加、减、乘、除四则运算。其算法规则如下:

加运算:0+0=0,0+1=1,1+0=1,1+1=10 减运算:1-1=0,1-0=1,0-0=1,0-1=1 乘运算:0*0=0,0*1=0,1*0=0,1*1=1 除运算:二进制只有两个数(0,1) 具体的四则运算方法参见书本。 2.3.2 补码运算

补码的加法运算规则是: [X+Y]补= [X ]补+[Y]补

该式表明,当有符号的两个数采用补码形式表示时,进行加法运算可以把符号位和数值位一起进行运算(若符号位有进位,则丢掉),结果为两数之和的补码形式。

例如用补码进行下列运算:(+33)+(+15);(+33)+(-15),最终的结果分别是[+48]补和[+18] 补。

补码的减法运算规则是: [X-Y]补=[X]补+[-Y]补

该式表明,求[X-Y]补可以用[X]补与 [-Y]补相加来实现。

[-Y]补是对减数进行求负操作。一般称已知 [Y]补求得 [-Y]补的过程叫变补或求负。已知[+Y]补求[-Y]补的规则是全部位(含符号位)按位取反后再加1。

具体的补码计算步骤参见书中介绍。 2.3.3 二进制的逻辑运算

二进制的逻辑运算有“与”、“或”、“非”和“异或”四种。

1. “与”运算(AND)

“与”运算又称逻辑乘,用符号“.”或“∧”来表示。运算规则如下:

0∧0 = 0 0∧1 = 0 1∧0 = 0 1∧1 = 1

即当两个参与运算的数的对应码位中有一个数为0,则运算结果为0,只有两码位对应的数都为1结果才为1。这与前面介绍的二进制乘法运算是一样的。

2. “或”运算(OR)

“或”运算又称逻辑加,用符号“+”或“∨”表示。运算规则如下: 0∨0 = 0 0∨1 = 1 1∨0 = 1 1∨1 = 1

即当两个参与运算数的相应码位只要有一个数为1,则运算结果为1,只有两码位对应的数均为0,结果才为0。如“10111101”进行“非”运算后就得到“01000010”,对比相应位即可验证以上运算规则了。

3. “非”运算(NOT)

“非”运算实现逻辑否定,即进行求反运算,非运算规则:0 = 1,1 = 0。注意“非”运算只是针对一个数所进行的“运算”,这与前面的“与”和“或”运算不一样。它的实质意义就是取反。如“10111101”进行“非”运算后就得到“01000010”,对比相应位即可验证以上运算规则了。

4. “异或”运算(XOR)

“异或”运算用符号“⊕”来表示。其运算规则如下:0⊕ 0 = 0; 0 ⊕ 1 = 1;1 ⊕ 0 = 1;1 ⊕ 1 = 0 。即当两个参与运算的数取值相异时,运算结果为1,否则为0。下面两图是两个二进制数异或运算过程。

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4