计算机组成原理学习之路(一)——数据表示

参考资料:《计算机组成原理》(秦磊华版)

计算机内部流动的信息可以分为两大类:一类为数据信息,另一类为控制信息。数据信息是计算机加工处理的对象,而控制信息则控制数据信息的加工处理。

1 数据表示应考虑的因素

数据表示的作用就是将数据按照某种方式组织,以便机器硬件能直接识别和引用。由于数字计算机中的信息都是由逻辑电路进行处理,因此,应用中的任何数据要能直接被计算机识别和引用,必须首先表示成二进制。

  1. 数据类型
    • 数值数据:又确定的值,表示数的大小,一般用于科学计算
    • 非数值数据:又称符号数据,没有值得含义,一般用来表示符号或文字
  2. 数据表示范围和精度:计算机所能表示数的范围和精确度与所采用的数据类型和字长有关
  3. 存储和处理的代价
  4. 软件的可移植性

2 数值数据的表示

2.1数的机器码表示

对于原码、反码和补码而言,数据的最高位(最左位)为 “0” 时,表示该数为正数;数据的最高位(最左位)为 “1” 时,表示该数为负数。对于移码,则正好相反,数据的最高位为 “0” 时,表示数为负数;数据的最高位为 “1” 时,表示该数为正数。为了区分一般书写时表示的数和机器中编码表示的数,我们称前者为真值,后者为机器数。

2.1.1 原码表示

原码表示法是一种直观的数据表示方法,除符号被数值化以外,数值部分仍保留着其真值的特征。

真值原码
正小数+0.abcde0.abcde
负小数-0.abcde1.abcde
正整数+abcde0abcde
负整数-abcde1abcde

存在正 0 与负 0 之分:

  • +0:0.000
  • -0:1.000

优点:直观,在数的真值和它的原码表示之间的对应关系简单,相互转换容易。

缺点:加减运算复杂,两个数求和时,如果符号相同,则数值部分相加;如果符号相异,则数值部分相减。相减时,要先比较两个运算数绝对值的大小,然后做减法,最后结果的符号位与绝对值大的那个数的符号位相同。显然,利用原码实现加减法运算控制复杂,且不利于运算器设计的简化。

2.1.2 反码表示

反码表示法中,正数据的符号位为 0,数值部分与其真值相同,负数的符号为 1,数值部分通过对真值逐位取反得到。

真值反码
正小数+0.abcde0.abcde
负小数-0.abcde1.a非b非c非d非e非
正整数+abcde0abcde
负整数-abcde1a非b非c非d非e非

存在正 0 与负 0 之分:

  • +0:0.000
  • -0:1.111
2.1.3 补码表示

正数的补码与原码一致。

利用反码求补码:求一个负数的补码,可以在其反码的基础上通过在最低位加 1 的方式得到。

利用扫描方法求补码:扫描方法可以很方便地将一个负数从真值或原码表示直接变换成补码,具体方法是对数值位按照从低位到高位的顺序(假设低位在数的尾部)扫描,尾数第一个 1 及其右边的 0 保持不变,其余各位求反,最后再将符号位置 1。

不存在正 0 与负 0 之分,它们的补码都为 0.000。

真值补码
正小数+0.abcde0.abcde
负小数-0.abcde1.a非b非c非d非e非 + 0.00001
正整数+abcde0abcde
负整数-abcde1a非b非c非d非e非 + 1
2.1.4 移码表示

移码可通过真值 x 加上一个常数得到,这个常数也称为偏置值,增加常数的操作相当于 x 在数轴上向正方向平移了一段距离,这就是称为 “移码” 的原因,移码也可称为增码。即:

[ x ] 移 = x + 偏 移 值 [x]_移= x+偏移值 [x]=x+

移码通常用于表示浮点数的阶码,整数表示。最常见的移码偏置值为 2n(n 为整数中不包含符号位的整数位数)。

7 位整数 x 的移码形式为:

[ x ] 移 = 2 7 十 x      ( 一 2 7 ≤ x < 2 7 ) [x]_移= 2^7十x~~~~(一2^7 ≤ x < 2^7) [x]=27x    (27x<27)

真值移码
正整数+abcde1abcde
负整数-abcde0a非b非c非d非e非 + 1

移码的符号位中 “0” 表示负数,“1” 表示正数。

同一数值的移码和补码除符号位相反外,数值位相同。

移码中 0 的表示也唯一,具体表示为 10000。

将移码作为浮点数的阶码具有下列优点:

  • 移码通过偏移的方法把真值映射到正数域,这样可直接按无符号数规则比较两个移码表示数据的大小,便于浮点数的比较。
  • 有利于简化 “机器零” 的判断,当移码的各位均为 0 时,对应的阶码值最小,此时,当尾数为全 0,对应的就是机器零。

2.2 数的定点表示

定点表示法约定机器中所有数据的小数点位置固定,其中,将小数点的位置固定在数据的最高数位之前(或符号位之后)的数据表示称为定点小数,而将小数点固定在最低数位之后的数据表示称为定点整数。另外,由于小数点位置固定,因而小数点可不必再用记号表示,也无需存储。

  1. 定点小数:将小数点的位置固定在数据的最高数位之前(或符号位之后)的数据。
  2. 定点整数:将小数点固定在最低数位之后的数据表示称为定点整数。

定点数能表示的数据范围与下列因素有关:

  • 字长,一般而言,字长越长,表示的数据范围就越大。
  • 所采用的机器数表示方法,补码和移码数据表示所能表示的数据范围比原码和反码所能表示的数据范围要多一个数据单位。

2.3 浮点数据表示

浮点表示法是小数位置点在数据中不固定,即小数点在数中可以浮动的一种数据表示方法,它由阶码和尾数两部分组成,其中阶码的位数决定数据的范围,尾数的位数决定数据的精确度。

2.3.1 浮点数据表示的一般格式

对任意一个二进制数 N 都可表示成:
N = 2 E × M N = 2^E \times M N=2E×M
其中,E 为数 N 的阶码,M 称为数 N 的尾数。
在这里插入图片描述
其中,Es 表示阶码的符号,E~Em 为阶码的值,Ms 表示尾数的符号(也决定整个数的正负),M~Mn 构成尾数,尾数是小于 1 的数。

2.3.2 IEEE 浮点数据表示

在浮点数据表示中,不同机器可能选用不同基、不同的阶码及尾数的位数,从而导致不同机器浮点数据表示的差异性较大,不利于软件的移植。为此,美国电气及电子工程师协会 IEEE 于 1985 年提出了浮点数标准 IEEE 754,现在该浮点数标准已被主流计算机所采用。

32 位 IEEE 754 单精度浮点数格式:IEEE 754 浮点数据表示由符号位 S、阶码部分 E 和尾数部分 M 组成,具体形式如下:
在这里插入图片描述
其中 S 占 1 位,E 占 8 位,M 占 23 位。

  • 阶码字段 E:在 IEEE 754 标准中,阶码部分采用偏移值为 127 的移码表示。

  • 尾数字段 M:在 IEEE 754 标准中,约定小数点左边隐含一位 1,即尾数的实际有效位数为 24 位,完整的尾数形式为 1.M,但在进行浮点数据表示时只保存 M,正是由于要将尾数变成 1,阶码的偏移值才为 127 而不是 128。

与 IEEE 754 格式相对应的浮点数的真值可表示为:
N = ( − 1 ) S × 2 E − 127 × 1. M N= (-1)^S \times 2^{E-127} \times 1.M N=(1)S×2E127×1.M
随着 E 和 M 的取值不同,IEEE 754 浮点数据表示具有不同的意义:

  • E = 0,M = 0:表示机器零。
  • E = 0,M ≠ 0:则 N = ( − 1 ) S × 2 E − 126 × 0. M N= (-1)^S \times 2^{E-126} \times 0.M N=(1)S×2E126×0.M,表示一个非规格化的浮点数,非规格化的主要目的是为了提高数据的精确度。
  • 1 ≤ E ≤ 254: N = ( − 1 ) S × 2 E − 127 × 1. M N= (-1)^S \times 2^{E-127} \times 1.M N=(1)S×2E127×1.M,表示一个规格化的浮点数。
  • E = 255,M = 0:表示一个无穷大的数,对应于 x / 0(其中 x ≠ 0)。
  • E = 255,M ≠ 0:N = NaN,即 N 是一个非数值,对应于0 / 0。

32 位 IEEE 754 浮点数与真值之间的变换流程如图:

在这里插入图片描述

2.3.3 浮点数的规格化

在浮点运算过程中,为了保证数据的精度,要求尾数的最高位为非 0 数码,即当尾数的值不为零时,其绝对值应大于或等于 (1/2)10,这是浮点数规格化的基本要求。因此,对于非规格化浮点数,可以通过将尾数左移或右移,并修改阶码的值以满足规格化要求。

以补码表示为例,正数规格化后,尾数的形式为:

0.1 X X . . . X 0.1XX...X 0.1XX...X

负数规格化后,尾数的形式为:

1.0 X X . . . X 1.0XX ... X 1.0XX...X

记号 “X” 可任取 0 或 1。

正数规格化后,尾数最大值为 0.111…1,尾数最小值为 0.100…0,即 (1/2) ≤ m < 1。

负数规格化后,尾数(补码表示)最大值为 1.011…1,尾数最小值为 1.000…0,即 -1 ≤ m < -(1/2)。

由于 -(1/2) 的补码形式为 1.100…0,为了方便机器判别,故约定不将 -(1/2) 列入规格化数。

虽然浮点表示能扩大数据的表示范围,但因为机器字长是有限的,所以它的表示范围仍然是有限的,如果在运算过程中,出现超出机器所能表示范围的数据,这种现象称为溢出。

在这里插入图片描述
上图给出了相应的补码规格化数的数值表示范围,图中 “可表示的负数区域” 和 “可表示的正数区域” 及 “0”,是机器可表示的数据区域;上溢区是数据绝对值太大,机器无法表示的区域;下溢区是数据绝对值太小,机器无法表示的区域。

如果运算结果落在上溢区,就产生了溢出错误,使得结果不能被正确表示,此时要停止机器运行,进行溢出处理。若运算结果落在下溢区,虽然也不能正确表示结果,但由于产生下溢的数的绝对值很小,因此常作 0 处理,并称为机器零。所谓机器零是指如果一个浮点数的尾数全为 0,则不论其阶码为何值,或者一个浮点数的阶码小于它能表示的最小负数,则不论其尾数为何值,计算机在处理它们时都把该浮点数作 0 处理。特别是当浮点数的阶码采用移码表示、尾数采用补码数据表示时,如果阶码等于它能表示的最小负数(即为 -2n 时,n 为阶码的位数)且尾数为 0 时,其阶码和尾数表现为全 0,从而有利于机器中判 0 电路的设计与简化。

一般来说,增加尾数的位数,将增加可表示区域数据点的密度,从而提高了数据的精度;增加阶码的位数,能增大可表示的数据区域,并缩小不能表示的数据区域,扩大了数据的表示范围。但是,在字长一定的情况下,增加数据表示范围将影响数据表示的精确度,反之亦然。

2.3.4 浮点数的表示范围和精度

数据的表示范围是指机器所能表示的一个数的最大值与最小值间的范围,数据的精度是指一个数的有效位数,有效位数越多,精度越高。

设计算机字长为 m + n 位(含相应的符号位),当采用一般浮点数格式表示时,m 和 n 分别表示阶码和尾数的位数(各包含一位符号位),且假设阶码和尾数均采用补码数据表示,能表示的数据范围如下:

在这里插入图片描述
从上图可看出,当机器字长一定时,分给阶码的位数越多,尾数占用的位数就越少,则数的表示范围越大。而尾数占用的位数减少,必然会减少数的有效数位,即影响数的精度。IEEE 754 单精度浮点格式所表示的非负数据特征如下所示:

在这里插入图片描述

3 非数值数据的表示

3.1 字符的表示方法

国际上广泛采用 ASCII 码(American StandardCode for Information Interchange)表示字符。它选用了常用的128 个符号,其中包括 33 个控制字符、10 个十进制数码、52 个英文大写和小写字母、33 个专用符号。128 个字符分别由 128 个二进制数码串表示。目前广泛采用键盘输入方式实现信息输入,当从键盘输入字符时,编码电路按字符键的要求给出与字符相应的二进制数码串,然后送交机器处理。计算机输出处理结果时,则把二进制数码串按同一标准转换成字符,由显示器显示或打印机打印出来。

128 个字符可以用 7 位二进制数对它们进行编码,即用 0000000~1111111 共 128 种不同的数码串分别表示 128 个字符,如果加上一个校验位,正好可用一个字节(8位)表示一个字符。

3.2 汉字编码

计算机要对汉字信息进行处理,首先要将汉字转换成计算机可以识别的二进制形式并输入到计算机,这是由汉字输入码完成的。汉字输入到计算机后,还需要转换成机内码才能被计算机处理,显然,汉字机内码也应该是二进制形式。如果需要显示和打印汉字,还要将汉字的机内码转换成汉字字形码

3.2.1 汉字输入码

用通用的西文键盘输入汉字,首先必须解决汉字的输入问题,汉字输入编码的研究是一个十分活跃的领域,到目前为止,国内外提出的编码方法有几百种之多,但编码的方式不外乎以下4大类:

  • 流水码:用数字组成的等长编码,如国标码、区位码。

  • 音码:根据汉字读音组成的编码,如拼音码。

  • 形码:根据汉字的形状、结构特征组成的编码,如五笔字型码。

  • 音形码:将汉字的读音与其结构特征综合考虑的编码,如自然码、钱码等。

3.2.1.1 区位码

区位码将汉字字符编成行列结构的二维矩阵,其中的行又称为区,列又成为位,区位码由此得名。区和位均用两位十进制数表示,因此,对应于一个汉字的区位码由 4 位十进制数构成,其中前两位对应区,后两位对应位。区位码将汉字编码 GB2312-80 中的 6763 个汉字分成 94 个区和 94 个位。区位码具有如下特点:

  1. 无重码。
  2. 等长,所有汉字的区位码都是 4 位。
  3. 由于汉字的区位与汉字之间的对应关系没有什么规律,记忆困难。
  4. 除输入汉字外,还能输入各种图形字符和制表符等。
3.2.1.2 拼音码

直接用汉字的拼音作为汉字编码,即每个汉字的拼音本身就是其输入码,这种编码具有如下特点:

  1. 具有重码,输入汉字拼音后还需要翻屏选择具体的汉字。
  2. 编码长度较长且可变。
  3. 容易使用,不需要任何其他记忆,只要会拼音,就能输入汉字。
  4. 只能输入汉字。
3.2.1.3 字形编码

这是一种根据汉字的形状、结构特征组成的编码,主要方法是将汉字拆分成若干个基本成分,用这些基本部分组成汉字的编码。由于拆分汉字的角度、方法不同,因而产生出各种各样的形码。其中五笔字型码是最为流行和普及的字形编码。该码特点是:重码少,输入速度快,但需要有一定的记忆。

3.2.1.4音形结合编码方法

音形码是既要考虑汉字的读音,又要考虑汉字的结构特征的一类输入码,它们通常由两部分组成,即反映汉字读音的编码和表现汉字本身结构特征的字根编码。音形码的种类很多。有首尾码、快速码、音形码、形声码、表形码、钱码、自然码等,其中自然码、钱码尤为突出。音形码的特点是选用的字根少,记忆量小。

3.2.2 汉字机内码

汉字机内码是计算机内存储和处理汉字时使用的编码。由于计算机要同时处理汉字和字符,因此,对汉字机内码编码时,既要考虑到与 ASCII 码严格区分,又要能与国标码或区位码之间具有简单的对应关系。汉字机内码与区位码之间的对应关系为:区位码 + A0A0H。由于文本中通常混合使用汉字和西文字符,汉字信息如果不与西文字符进行区别,就会与单字节的 ASCII 码混淆。此问题的解决方法之一是将一个汉字看成是两个扩展 ASCII 码,使表示 GB2312 汉字的两个字节的最高位都为 1,这样就能区别一个机内码到底对应一个汉字还是两个西文字符。

3.2.3 汉字字形码

字形码是汉字的输出码,输出汉字时都采用图形方式,无论汉字的笔画多少,每个汉字都可以写在同样大小的方块中。为了能准确地表达汉字的字形,对于每一个汉字都有相应的字形码。

目前大多数汉字系统中都是以点阵的方式来存储和输出汉字的字形。所谓点阵就是将字符(包括汉字图形)看成一个矩形框内一些横竖排列的点的集合,有笔画的位置用黑点表示,没笔画的位置用白点表示。在计算机中用一组二进制数表示点阵,用 0 表示白点,用 1 表示黑点。

一般的汉字系统中汉字字形点阵有 16X16,24X24,48X48 几种,点阵越大对每个汉字的修饰作用就越强,打印质量也就越高。通常用 16X16 点阵来显示汉字,每一行上的 16 个点需用两个字节表示,一个 16X16 点阵的汉字字形码需要 2X16=32 个字节表示,这 32 个字节中的信息是汉字的数字化信息,即汉字字模。汉字字模按国标码的顺序排列,以二进制文件形式存放在存储器中,构成汉字字模字库,也称为汉字字形库,简称汉字库。

4 数据信息的校验

4.1 码距与数据校验

通常将一组编码中任何两个编码之间不同代码的位数称为这两个编码的距离,简称码距,又称海明(Hamming)距离。对于一个编码体制,将其中所有的合法码距的最小值称为这个编码体制的码距。

码距是编码体制里一个重要概念,通过增加码距就能把一个不具备检错的编码变成具有检错功能的编码。校验码就是利用这一原理,在正常编码的基础上,通过增加一些附加的校验位而形成的。增加校验的同时也增加了码距,当码距增加到一定程度时,校验码不仅具有检错功能,而且还可具有纠正错误的能力。

根据信息论原理,码距 d 与校验码的检错和纠错能力的关系如下:

  1. d ≥ e + 1:可检测 e 个错误。
  2. d ≥ 2t + 1:可纠正 t 个错误。
  3. d ≥ e + t + 1:当 e ≥ t 时,可检测 e 个错误并纠正 t 个错误。

5 习题

习题 1 写出下列各数的原码、反码和补码:

真值原码反码补码
00.000 或 1.0000.000 或 1.1110.000
-01.0001.1110.000
0.101010.101010.101010.10101
-0.101011.101011.010101.01011
0.111110.111110.111110.11111
-0.111111.111111.000001.00001
-0.100001.100001.011111.10000
0.100000.100000.100000.10000

习题 2 求与 IEEE 754 32 位浮点数 43940000H 对应的十进制数:

解:先将 IEEE 754 32 位浮点数 43940000H 化为二进制形式:
0    10000111    00101000000000000000000 0~~100 0011 1~~001 0100 0000 0000 0000 0000 0  10000111  00101000000000000000000

则可知,数符 S = 0,阶码 E = 10000111,E - 127 = 00001000 = 8,尾数 M = 00101000000000000000000,1.M = 1.00101,

故对应的十进制数:
N = ( − 1 ) 0 × 2 8 × ( 1.00101 ) 2 = ( 100101000 ) 2 = 296 N = (-1)^0 \times 2^8 \times (1.00101)_2 = (100101000)_2 = 296 N=(1)0×28×(1.00101)2=(100101000)2=296

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值