当前位置:首页 > 数据表示与数据类型

数据表示与数据类型

    在计算机系统中,数据的类型有各种各样,如文件、图、表、树、阵列、队列、链表、栈、向量、串、实数、整数、布尔数、字符等。数据表示要研究的内容是要确定:所有这些数据类型中,哪些用硬件实现,哪些用软件实现,并研究它们的实现方法。

1.数据表示:数据表示是计算机硬件能够直接识别,可以被指令系统直接调用的那些数据类型。数据表示是数据类型中最常用,也是相对比较简单,用硬件实现相对比较容易的几种。如定点数(类似于数学中的整数)、逻辑数、浮点数(类似于数学中的实数)、十进制数、字符、字符串、堆栈和向量等。
2.数据结构:数据结构是面向系统软件,面向应用领域所需要处理的各种数据类型,以及这些数据类型的逻辑结构和物理结构之间的关系。除了数据表示之外的所有数据类型,一般来说都属于数据结构。
  因此,数据表示和数据结构都是数据类型的子集。确定哪些数据类型用数据表示实现,哪些数据类型用数据结构实现,实质上是软、硬件的主要分界面之一,也是计算机系统设计中的软件与硬件的取舍问题。

  如何确定数据表示这个子集是计算机系统结构设计人员要解决的难题之一。从原理上讲,计算机系统只要有了最简单的数据表示,如定点数表示,就能用软件实现其它各种各样的数据类型,包括很复杂的数据类型。例如,能够用定点运算的指令编写的子程序来实现浮点运算,实现逻辑运算,实现十进制运算,实现字符运算,模拟堆栈运算等。当然,这种系统的性能可能很差。相反,如果把许多很复杂的数据类型都用数据表示来实现,系统的硬件代价就会很高。


例1:
    举例说明,如果用定点数据表示实现浮点运算,处理机的运算速度要降低两个数量级以上。
    例如,用一台定点运算速度为每秒1千万次的计算机做科学计算,它的实际运算速度将低于每秒十万次。这是因为,当计算机系统中没有浮点数据表示时,通常要用子程序来实现浮点运算。用定点运算指令来实现32位的浮点运算,平均要执行100条以上的指令。CPU与主存储器之间的通信量也将增加100多倍。对于64位的双精度浮点数,程序运行时间和CPU与主存之间的通信量将增加200倍左右。
    尽管增加浮点数据表示,硬件的复杂度要增加许多,但是,由于浮点数据表示的通用性好,利用率高,在以科学计算为主的计算机系统中,设置浮点数据表示是必不可少的。

例2:
    实现矩阵加法A=A+B,A和B均为200×200的矩阵。分析在标量计算机和向量计算机上,程序运行速度和CPU与主存之间通信量的关系。
    如果在没有向量数据表示和向量指令的标量计算机系统上实现这个矩阵加法,一般需要6条指令,其中有4条指令要循环4万次。因此,CPU与主存储器之间的通信量:取指令2+4×40,000条,读或写数据3×40,000个,共要访问主存7×40,000次以上。
    如果在有向量数据表示的计算机系统上实现,只需要一条指令。从而,减少CPU与主存之间的通信量为:少取指令4×40,000次,缩短程序执行时间一倍以上。
    我们能够看到,随着计算机系统的发展,数据表示也在不断地上移。例如,在目前的计算机系统中,字符串数据表示,向量数据表示,堆栈数据表示等已经普遍使用。有些很复杂的数据表示,如图、表等数据表示也开始在某些计算机系统中出现。另外,还应该指出,对于一些复杂的数据类型,如果用数据表示来实现,硬件的代价可能非常大,然而,可以用硬件给以适当的支持,或者说,用软件和硬件相结合的方法来实现,效果会很好。例如,用字节编址和字节运算指令来支持字符串数据表示。用变址寻址方式来支持向量数据表示等。
    因此,在设计计算机系统时,对于数据类型,系统结构设计者首先要做的是:确定哪些数据类型全部用硬件实现,即数据表示;哪些数据类型用软件实现,即数据结构;哪些数据类型可由硬件给予适当的支持,即由软件和硬件共同来实现,并确定软件与硬件的适当比例关系