版权归原作者所有,如有侵权,请联系我们

[科普中国]-机器数

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

机器数是将符号"数字化"的数,是数字在计算机中的二进制表示形式。机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制。

特点机器数有两个基本特点:

1、数的符号数值化。实用的数据有正数和负数,由于计算机内部的硬件只能表示两种物理状态(用0和1表示),因此实用数据的正号“+”或负号“-”,在机器里就用一位二进制的0或1来区别。通常这个符号放在二进制数的最高位,称符号位,以0代表符号“+”,以1代表符号“-”。因为有符号占据一位,数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。 例如二进制真值数-011011,它的机器数为 1011011。

2、二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长8位叫一个字节(Byte),机器字长一般都是字节的整数倍,如字长8位、16位、32位、64位。1

分类根据小数点位置固定与否,机器数又可以分为定点数和浮点数。 通常,使用定点数表示整数,而用浮点数表示实数。整理如下:

1、整数。认为整数没有小数部分,小数点固定在数的最右边。整数可以分为无符号整数和有符号整数两类。无符号整数的所有二进制位全部用来表示数值的大小;有符号整数用最高位表示数的正负号,而其他位表示数值的大小。例如十进制整数-65的计算机内表示可以是11000001。

2、实数。实数的浮点数表示方法是:把一个实数的范围和精度分别用阶码和尾数来表示。在计算机中,为了提高数据表示精度,必须表示小数点的位置,因此规定浮点数必须写成规范化的形式,即当尾数不为0时,其绝对值大于或者等于0.5且小于1(注:因为是二进制数,要求尾数的第1位必须是1)。例如设机器字长为16位,尾数为8位,阶码为6位,则二进制实数-1101.010的机内表示为0000100111010100。

3、机器数与真值。不带符号的数是数的绝对值,在绝对值前加上表示正负的符号就成了符号数。直接用正号“+”和负号“-”来表示其正负的二进制数叫做符号数的真值。在计算机中不仅用0,1编码的形式表示一个数的数值部分,正、负号亦同样用0,1编码表示。把符号数值化以后,就能将它用于机器中。我们把一个数在机器内的表示形式称为机器数。而这个数本身就是该机器数的真值。“01101”和“11101”是两个机器数,而它们的真值分别为+1101和-1101。

机器数的形式1、原码

将数的真值形式中“+”号用“0”表示,“-”号用“1”表示时,叫做数的原码形式,简称原码。若字长为n位,原码一般可表示为:

当X为正数时[X]原和X一样,即[X]原 = X。当X为负数时 。由于X本身为负数,所以,实际上是将∣X∣数值部分绝对值前面的符号位上写成“1”即可。

原码表示法比较直观,它的数值部分就是该数的绝对值,而且与真值、十进制数的转换十分方便。但是它的加减法运算较复杂。当两数相加时,机器要首先判断两数的符号是否相同,如果相同则两数相加,若符号不同,则两数相减。在做减法前,还要判断两数绝对值的大小,然后用大数减去小数,最后再确定差的符号,换言之,用这样一种直接的形式进行加运算时,负数的符号位不能与其数值部分一道参加运算,而必须利用单独的线路确定和的符号位。要实现这些操作,电路就很复杂,这显然是不经济实用的。为了减少设备,解决机器内负数的符号位参加运算的问题,总是将减法运算变成加法运算,也就引进了反码和补码这两种机器数。

2、反码

如前所述,为了克服原码运算的缺点,采用机器数的反码和补码表示法。即对正数来说,其反码和原码的形式相同;对负数来说,反码为其原码的数值部分各位变反。

3、补码

补码是根据同余的概念引入的,我们来看一个减法通过加法来实现的例子。假定当前时间为北京时间6点整,有一只手表却是8点整,比北京时间快了2小时,校准的方法有两种,一种是倒拨2小时,一种是正拨10小时。若规定倒拨是做减法,正拨是做加法,那么对手表来讲减2与加10是等价的,也就是说减2可以用加10来实现。这是因为8加10等于18,然而手表最大只能指示12,当大于12时12自然丢失,18减去12就只剩6了。这说明减法在一定条件下,是可以用加法来代替的。这里“12”称为“模”,10称为“-2”对模12的补数。推广到一般则有:

A – B = A + ( – B + M ) = A + ( – B )补

可见,在模为M的条件下,A减去B,可以用A加上-B的补数来实现。这里模(module)可视为计数器的容量,对上述手表的例子,模为12。在计算机中其部件都有固定的位数,若位数为n,则计数值为 ,亦即计数器容量为 ,因此计算机中的补码是以“ ”为模,其定义如下:

简言之,对正数来说,其补码和原码的形式相同;而从(3)式和(4)式可以看出,对于负数,补码为其反码的末位加1。

总之,正数的原码、反码和补码是完全相同的;负数的原码、反码和补码其形式各不相同。另外,特别要注意的是,对于负数的反码和补码(即符号位为1的数),其符号位后边的几位数表示的并不是此数的数值。如果要想知道此数的大小,一定要求其反码或补码才行。1

机器数的算术运算1、反码的算术运算

反码运算要注意的问题:

(1)反码运算时,其符号位与数值一起参加运算。

(2)反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)。

(3)用反码运算,其运算结果亦为反码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求反才是其真值。

[例1] 已知X = + 1101 , Y = + 0110 , 用反码计算Z = X-Y。

解: [X]反 = 01101,[-Y]反 = 11001,则[Z]反 =[X]反+[-Y]反 = 01101+11001+1(循环进位)= 00111 , 其真值为Z = +0111。

[例2] 已知X = + 0110 , Y = + 1101 , 用反码计算Z = X-Y。

解: [X]反 = 00110,[-Y]反 = 10010,则[Z]反 =[X]反+[-Y]反 = 00110 + 10010= 11000 , 其真值为Z = - 0111。

采用反码运算较好的解决了原码运算所遇到的困难或问题,但由于循环进位需要二次算术相加,延长了计算时间,这同样给电路带来麻烦。而采用下述的补码运算则可避免循环进位的两次计算,同时,采用补码运算对溢出的判断也较采用反码简单的多,所以机器中的算术运算普遍采用补码运算。

2、补码的算术运算

补码运算要注意的问题:

(1)补码运算时,其符号位与数值部分一起参加运算。

(2)补码的符号位相加后,如果有进位出现,要把这个进位舍去(自然丢失)。

(3)用补码运算,其运算结果亦为补码。在转换为真值时,若符号位为0,数位不变;若符号位为1,应将结果求补才是其真值。

[例3] 已知X = + 1101 , Y = + 0110 , 用补码计算Z = X-Y。

解: [X]补 = 01101,[-Y]补 = 11010,则[Z]补 =[X]补+[-Y]补 = 01101+11010

= 100111 , 其真值为Z = + 0111。

[例4] 已知X = + 0110 , Y = + 1101 , 用补码计算Z = X-Y。

解: [X]补 = 00110,[-Y]补 = 10011,则[Z]补 =[X]补+[-Y]补 = 00110 + 10011

= 11001 , 其真值为Z = - 0111。

3、溢出及补码溢出的判断

无论采用何种机器数,只要运算的结果大于数值设备所能表示数的范围,就会产生溢出。 溢出现象应当作一种故障来处理,因为它使结果数发生错误。异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位。

由于补码运算存在符号位进位自然丢失而运算结果正确的问题,因此,应区分补码的溢出与正常进位。

[例5] 某数字设备用五位二进制表示数,计算

(1)9+3 (2)-9-3 (3)9+12 (4)-9-12

解:(1)[+9]补+[+3]补= 01001+ 00011 = 01100 = +12 正确;

(2)[-9]补+[-3]补= 10111+ 11101 = 110100 = 10100(符号位进位自然丢失),其真值为-1100 = -12正确;

(3)[+9]补+[12]补= 01001 + 01100 = 10101 其真值为-1011 =-11错误,产生了溢出;

(4)[-9]补+[-12]补 = 10111+10100 = 101011 其真值为01011= +11 错误,产生了溢出。

(1)、(2)两题结果均正确,查其最高位和次高位的进位位,不是均无进位产生,就是均产生进位;(3)、(4)两题结果均错误,查其最高位和次高位的进位位,只有一位产生了进位。此即为判断机器是正常进位还是溢出的基本依据,在微型机中可用异或电路来实现上述的判断。2

机器数的表示方法1、定点表示法

定点,即小数点固定,固定在有效数位的最前面或最后面。因为位置是固定的,所以可以隐藏。

在最前面则表示纯小数,在最后面则表示纯整数,因此在定点计算机的编程语言中,纯小数对应一种变量类型,纯整数对应一种变量类型。

由于只能表示纯小数或纯整数,在编程时要设置合适的比例因子。

2、浮点表示法

N = M x rE

r是浮点数阶码的底,又叫尾数的基数,通常r=2,但可改变。

r增大,可表示数的范围增大。

r增大,可表示数的个数增大。

r增大,可表示数的精度下降。

r增大,将使运算中移位的次数减少,运算速度提高。

E叫做阶码,纯整数,常用移码或补码表示。

M叫做尾数,纯小数,常用原码或补码表示。

E与M都是带符号的定点数。

阶码存入阶码部件,尾数存入尾数部件,一个浮点数是由两个不同的物理部件处理的,

机器就是这么区分哪部分是阶码,哪部分是尾数的,各部件又可进行各种操作,如阶码的相加、相减、比较操作。

浮点数的表示范围主要由阶码的位数决定,有效数字精度主要由尾数的位数决定。

浮点数的阶码常采用移码表示,最主要的原因为:

(1)便于比较浮点数的大小。阶码大的,真值就大;阶码小的,真值就小。

(2)简化机器中的判0电路。当阶码全为0,尾数也全为0时,表示0。

同一数值的移码和补码除最高位相反外,其它各位相同。

移码通常取2n-1或2n为偏置值。3

本词条内容贡献者为:

李嘉骞 - 博士 - 同济大学