2.2 数制
2.2.1 按位计数制
无符号数值数据常用按位计数制表示,如二进制、八进制、十进制和十六进制等。进制之间的关系对照见表2-1。日常生活中使用的是十进制,而数字电路中直接处理的是二进制数,八进制和十六进制虽不直接处理,但是因为基数均是2的幂,因而在表示多位二进制数时很有用。
表2-1 按位计数制对照表
按位计数制具有相同的技术特点和规则,总结其基本概念如下。
1)基数:进制数“2、8、10、16”分别为二、八、十、十六进制的基数。
2)数码:二进制数码为0、1,十进制为0~9,十六进制则是0~9、A~F。
3)权值:每个位置都有相应的“权值”,简称权。权值按基数的幂次变化,以小数点的位置为基准,小数点左边(整数部分)为正,按0、1、2、… 的顺序增加;小数点右边(小数部分)为负,按-1、-2、… 的顺序变化。例如,二进制数中第i位的权是2i。
4)计数规则:二进制计数时逢二进一,借一当二,其他进制具有相类似的计数规则。
2.2.2 数制转换
按位计数制之间可以相互转换。二进制、八进制、十六进制等转换为十进制数比较简单,按权展开用十进制算式求和就可以得到等值的十进制数。
例2-1 分别将二进制数(10011)2和(101.101)2转换为十进制数。
解(10011)2=1×24+0×23+0×22+1×21+1×20=(19)10
(101.101)2=1×22+0×21+1×20+1×2-1+0×2-2+1×2-3=(5.625)10
表达式中括号外的下标表示进制。二进制数的每个位置只有两种可能的取值:1或0,与数字信号只有高电平和低电平相对应,是一种适用于硬件的数值表示法,这也是学习二进制表示法的目的所在。然而,由于基数太小,二进制数并不适合人们直接使用。为了方便读写,数字系统也经常使用和二进制数具有简单对应关系的十六进制数。
十进制转换为非十进制时,整数和小数分别采取不同的方法。例如,十进制转换为二进制:整数除2取余,而对小数则乘2取整。
例2-2 将十进制数(218.6875)10转换为二进制数。
解 对十进制整数的转换采用竖式连除法,如图2-1所示。最先产生的余数为最低位,最后产生的余数是最高位(除到0为止),十进制整数218的转换结果为(11011010)2。
图2-1 除2取余算式
对十进制小数采用乘2取整法,最先产生的整数为小数最高位,最后产生的整数为小数最低位。
0.6875×2=1.375,取整数1,为小数最高位;
0.375× 2=0.75,取整数0;
0.75× 2=1.5,取整数1;
0.5× 2=1.0,取整数1,为小数最低位;
十进制小数0.6875的转换结果为(0.1011)2。
因此,十进制数(218.6875)10转换为二进制数结果为(11011010.1011)2。
2.2.3 原码、反码和补码
带符号数(带有正、负符号的数值数据)通常采用二进制原码、反码或补码表示。表2-2中以+13、-13的8位表示为例,归纳了原码、反码和补码的格式及相互之间的关系。
表2-2 二进制原码、反码、补码对照表
表2-2表明:8位二进制数的左侧第1位为符号位,后面7位为数值。正数的原码、反码和补码格式相同,用0表示正,7位数值0001101表示13;负数的符号位用1表示负,7位数值0001101原码表示13,反码的数值在原码数值基础上按位取反,补码的数值则在反码数值基础上最低位加1。
例2-3 采用8位二进制原码、反码和补码方式分别表示(0.01101)2和(-0.01101)2。
解(0.01101)2=(0.0110100)原码=(0.0110100)反码=(0.0110100)补码
(-0.01101)2=(1.0110100)原码=(1.1001011)反码=(1.1001100)补码
原码、反码、补码的应用
大多数计算机和其他数字系统采用二进制补码数制来表示有符号数,以及相关算术运算,究其原因在于利用原码和反码构造加法电路时,逻辑电路的实现非常复杂。二进制原码加法电路实现时必须检查加数和被加数的符号以决定对数值执行何种操作,如果符号相同,就将数值相加,并给计算结果赋以相同的符号;如果符号不同,就必须比较数值大小,用较大的数值减去较小的数值,并以较大数值的符号赋以结果。二进制反码加法器的设计同样远比二进制补码加法器棘手。而二进制补码加法电路则是将符号位一起进行加法运算,电路设计得到极大简化。
了解原码、反码和补码的表示范围对于带符号数的运算具有重要意义。表2-3中列出了4位二进制原码、反码、补码所能表示的十进制数范围。
表2-3 十进制数与4位二进制原码、反码、补码
① 超出有符号数的4位二进制表示范围。
② 按照数制变化特点,表中规定1000在4位补码中表示-8,而不是用来表示-0。
2.2.4 补码运算
符号位参与补码运算。当两个二进制补码表示的数值进行加减运算时,符号位像数值位一样参与运算。当然,大多数二进制补码的减法电路并不直接做减法,而是通过取减数的补码(将减数变为负数),再将被减数与减数按正常的加法规则相加即可。
例2-4 利用4位二进制补码分别计算十进制数2+3、4+7、-4+7以及-4-7位的加法。
解 4位二进制补码表示:2为(0010)补码,3为(0011)补码,4为(0100)补码。
-4为(1100)补码,7为(0111)补码,-7为(1001)补码,加减法运算式如下:
计算式的正确结果分别为+5、+11、+3和-11,采取4位二进制补码计算出现错误。
补码运算可能产生溢出。例2-4表明:当加法或减法运算的结果超出位数所能表示的范围时,便产生溢出。如表2-3所示,四位二进制补码的表示范围为-8~+7,正数加法结果超过+7产生溢出,负数加法结果超过-8产生溢出。
溢出判断与解决
1.溢出判断的两种简便规则
1)符号判断法:同号数相加可能溢出,异号数相加不会溢出。
2)进位判断法:如果加法产生向符号位的进位与符号位运算产生的进位输出不同,则发生溢出。
2.解决方法
增加补码数制的位数(符号位扩展),用更多的数位表示二进制补码结果。如例2-4采用5位及以上位数进行补码运算,可解决溢出问题。