3.1.2 数据格式
在计算机处理对象中,数据是一种很重要的类型。数据有不同的表示形式。从使用计算机的用户角度看,计算机处理的数据有文字、数字、图表、声音、视频等类型,一般称这些数据为媒体数据。从计算机算法的角度看,数据有图、表、树、栈、队列等类型。从计算机高级语言程序设计者的角度看,数据有数组、结构、整数、实数、字符、字符串等类型。这些不同种类的数据在计算机内部都是以一种相同的数据类型被处理的,这就是机器指令。那么,从这个角度看,数据就只有整数、浮点数、位串这几种基本类型。
现实生活中的媒体数据经过计算机输入设备转化为二进制编码后才能被计算机处理,这个过程称为数字化编码。数字化编码是指对媒体数据进行采集后,将媒体数据转换为计算机能够识别的编码信息,这种编码是用0和1来表示的。上文中提到的“编码”一词,编码是指用一些简单的特定的符号,对大量复杂的信息进行一定程度的规律的组合。比如,电报中用4位十进制数字来表示常用的汉字,这就是一个典型的编码的例子。因此,计算机中的信息也需要进行编码。由于计算机内部以数字电路为构造基础,计算机内部的信息都是经过二进制编码的。这样设计的好处在于如下两个方面:
(1)数字电路中的元器件只需“开”和“关”两种状态即可。这种元器件工作比较稳定,抗干扰能力强,生产成本也很低廉。而“开”和“关”恰恰就可以用0和1来表示。
(2)二进制运算规则简单,0和1正好与逻辑中的“真”和“假”相对应。
在计算机内部,计算机指令处理的数据类型分为数值数据和非数值数据。数值数据包括整数和实数,整数又包括无符号整数和带符号整数。整数就是高级编程语言中的定点数,实数就是浮点数。非数值数据是指位串,比如字符串等。
计算机发展到今天,计算机内部的数值数据有两种表示方式:第一种是直接把数据转化为二进制数表示;第二种是用BCD 码来表示。BCD 码即二进制编码的十进制数。数值数据表示除了要有编码规则外,还需要有进位计数制和定/浮点表示。
在数学中,我们使用的数据分为整数和实数。整数是没有小数点的,所以整数的小数点相当于是固定的,它的位置在此整数的最右边,因此忽略不写。实数则不同,实数有小数点并且其小数点位置不固定。在计算机系统中,只有0和1两个数据能被计算机识别,其中并没有小数点这个符号。因此,在计算机系统中准确地表示实数是一个必须要解决的问题。通常,计算机通过约定小数点的位置来解决这个问题。小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。
1.定点数表示法(Fixed-Point Number)
所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。
定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x 的形式为x=x 0 x 1 x 2…x n(其中x 0 为符号位,x 1 x 2…x n 是数值的有效部分,也称为尾数,x 1 为最高有效位),则在计算机中的表示形式如图3.1所示。
图3.1 定点小数在计算机中的表示
一般来说,如果最末位x n=1,前面各位都为0,则数的绝对值最小,即|x|min=2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示范围是:
定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x 的形式为x=x 0 x 1 x 2…x n(其中x 0 为符号位,x 1 x 2…x n 是尾数,x n 为最低有效位),则在计算机中的表示形式如图3.2所示。
图3.2 定点整数在计算机中的表示
定点整数的表示范围是:
当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;当数据大于定点数能表示的最大值时,计算机将无法表示,称为上溢。上溢和下溢统称为溢出。
当计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果根据比例因子,还原成实际数值。若比例因子选择不当,往往会使运算结果产生溢出或降低数据的有效精度。
2.浮点数表示法(Floating-Point Number)
在学习科学记数法的时候,我们把数据表示成如下形式:
类似地,浮点数可以表示成如下形式:
S 取值为0或1,它表示N 的符号。M 是二进制定点小数,这里称为尾数。E 是二进制定点整数,这里称为阶。J 表示数的进制,也就是基数。这种表示方法相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法。
由此可见,浮点数的取值范围是:
式中,m 和n 分别表示阶和尾数的位数。
由此可见,浮点数的表示范围比定点数要大很多。