组成原理---信息编码与数据表示

数值数据的表示

计算机中的信息可以分为数据信息地址信息控制信息三大类,而数据信息又包括数值数据和非数值数据。

进位计数制

  • 数制又称为进位计数制,即按进位制的方法进行计数。数制由两大要素组成:基数 R与各数位的 W。基数 R决定了数制中各数位上允许出现的数码个数,基数为 R 的数制即称为 R 进制数。权 W 则表明该数位上的数码所表示的单位数值大小。因此,权W 是与数位的位置有关的一个常数,不同的数位有不同的权,同一个数码位于不同的位置,其所代表的数值也不同,故又称为位权。

  • 假设任意数值 N 用 R 进制数来表示,表示形式为用 m+k 个自左向右排列的符号来表示N:N=(Dm-1Dm-2…D0 .D-1D-2…D-kR 。其中,Di为该进制的基本符号,Di∈[0,R-1], i 为各个数位的编号, i= -k, -k+1…m-1,小数点在 D0和 D-1之间,则数值 N 的实际值为:D-k*R-k+…+Dm-1*Rm-1。其中, 第 i 位的权 Wi为Ri。通常最左边的数位 Dm-1的权最大,称为最高有效位 MSB(most significant bit);最右边的数位 D-k的权最小,称为最低有效位 LSB(least significant bit);

  • R 进位计数制的主要特点就是逢 R 进一。计算机中常见的数制有二进制、八进制、十进制、十六进制,它们允许使用的数字符号分别为 0~1、0~7、0~9、0~9 和 A~F,A~F 用于表示十六进制的 10~15。

  • 计算机中主要使用二进制表示数据
    比较容易找到具有二值状态的物理器件来表示和实现存储,比如脉冲的有无、电压的高低、纸带上有无打孔等等。

    二值性使二进制数据的存储具有抗干扰能力强,可靠性高的优点。

    二进制数的运算规则非常简单,运算输入状态和输出状态较少,便于使用电子器件和线路实现加粗样式

    二进制数据的 0 和 1 与逻辑推理中的“真”和“假”相对应,为实现逻辑运算和逻辑判断提供了便利

  • 由于人们总是习惯于使用十进制数据,因此计算机中支持用户以十进制形式输入数据,在计算机内部转化为二进制进行存储和运算,最后又将处理的结果以十进制形式输出给用户。

不同数制之间的相互转换

  • 二进制数转换成十进制数
    任何进制数转换成十进制数,本质就是加权求和。在书写时,为区别数字串是二进制还是十进制、八进制或十六进制表示,通常将数字串用括弧括起来,括弧外边右下角标以数制的基数 2、10、8、16,也可以直接在数字串后面缀以大写或小写的“B”、“D”、“ Q”、“H”,分别代表二进制(Binary)、十进制(Decimal)、八进制(Octal)和十六进制(Hexdecimal)的英文缩写。不同进制数可在同一表达式中出现。

    在不同的计算机编程语言中,进位计数制的表达方式也不同(与编译器有关)。

  • 十进制数转换成二进制数
    对于十进制数的整数部分和小数部分必须分别进行转换处理,得出结果后再合并。

    十进制整数转化为二进制数的方法是:除以 2 取余数,先得整数低位。除以 2 取余数后,继续对商做除法,直至商为 0。

    十进制小数转化为二进制数的方法是:乘以 2 取整数,先得小数高位。乘以 2 取整数后,继续对小数做乘法,直至积为 0 或小数位数已满足精度要求。值得注意的是,并不是所有的十进制小数都可以完全等价地转化为二进制数,即有可能乘积不能够为 0,此时必须使用精度来控制转换结束。 对于小数由于要求精度大于 10%,而 1/16 < 1/10 =10%,因此可以取小数位数 4 位即可。

  • 二进制数与八进制、十六进制数之间的转换
    由于 3 位二进制数可以恰好组成 1 位八进制数,因此由二进制数转化为八进制数比较简单:从小数点开始,向两边每 3 位划为一组,整数部分不足 3 的,在前面补“0”,小数部分不足 3 位的,在后面补“0”,然后写出各组的八进制数字。

    二进制数转化为十六进制数据的方法为:从小数点开始,向两边每 4 位一组,整数部分不足 4 位的,在前面补“0”,小数部分不足 4 位的,在后面补“0”,然后写出各组的十六进制数字符号。

    由八进制数转化为二进制数的方法是:将每一位八进制数字写出它的 3 位二进制编码,注意,不能省略高位或低位的“0”,当整个转换完成时,才可以省略高位或低位的“0”。十六进制数转化为二进制数,只需将每一位十六进制数字写出它的 4 位二进制编码即可。

十进制数的编码

  • 二-十进制码(BCD 码) (Binary Coded Decimal)
    所谓二-十进制码,即使用二进制来编码十进制数字 0~9。由于十进制数字有 10 个,所以二进制编码状态也必须有 10个,因此一般使用四位二进制编码来表示一位十进制数字,选用 16 个 4 位二进制编码中的10 个来表示数字 0~9。不同的选择构成不同的 BCD 码。
    在这里插入图片描述
    常用的 BCD 码分为有权码和无权码。有权码的每一位都有固定的权值,加权求和的值即是它所表示的十进制数字。它们每一位的权就是编码名称中的四个数字。在没有特别指出的一般情况下,所提到的 BCD 码通常就是指 8421码。

    除 8421 码外的各有权码它们都是自补码即任何两个相加之和等于 9 的编码,互为反码自补码有利于减法的运算处理。

    对于 2421 码、5211 码、4311 码,任何两个和数大于等于 10 的 BCD 编码直接相加,会在最高位产生向左的进位,有利于实现逢十进一的运算规则。

    无权码的四位二进制编码的每一位并没有固定的权。

    格雷码又叫循环码,它的任何相邻的两个编码之间只有一位二进制位不同,其余三位二进制对应位均相同,它的优点是用它构成计数器时,在从一个编码变到下一个编码时,只有一个触发器翻转即可,波形更完美、可靠。格雷码的编码方案有许多种。

    余 3 码就是对应的 8421 码加上 0011 构成的,它的主要优点是执行十进制加法时,可以正确地产生进位信号,而且还便于减法运算。

    在计算机内的运算器硬件是基于二进制设计的,因此,要实现 BCD 码的算术运算比较复杂。在某些情况下,必须对二进制运算器运算结果进行修正,以便产生正确的十进制结果。

  • 十进制数串的表示方法
    十进制数串在计算机内的表示形式

    字符串形式:这种方式,一个字节存放一个十进制的数位或符号位,直接以 ASCII 码的形式存放。为了指明这样一个数,需要给出该数在主存中的起始地址和位数(字符串的长度)。与 BCD码相比,对字符串形式表示的十进制数串进行运算更不方便,因为数字的 ASCII 码高四位并不参加运算。

    压缩的十进制数串形式:用压缩的十进制数串表示一个数,一个字节存放两个十进制的数位。它比前一种形式节省存储空间,又便于直接完成十进制数的算术运算,是广泛采用的较为理想的方法。 压缩的十进制数串的每个十进制数位占用半个字节,其值可用 BCD码或数字符号的 ASCII 码的低 4 位表示。符号位也占半个字节并放在最低位数字位之后,其值选用四位 BCD 编码中的六种冗余状态中的有关值。在这种表示中,规定数位加符号位之和必须为偶数,当和不为偶数时,应在最高数字位之前补一个 0。与字符串表示形式类似,要指明一个压缩的十进制数串,也必须给出它在主存中的首地址和位长。

    采用十进制表示数据的优点是:
    对于需要大量地进行输入输出数据而运算简单的场合,大大减少了进制转换,提高了机器的运行效率;

    十进制数串的位长可变,许多机器中规定该长度从 0 到 31,有的甚至更长。不受定点数和浮点数统一格式的约束,从而提高了数据的表示范围和运算精度。

数据格式

机器数

  • 数值数据在计算机中的表示形式称为机器数。机器数的特点是:表示的数值范围受计算机字长的限制;机器数的符号位必须被数值化为二进制 0 和 1;机器数的小数点是用隐含规定的方式来表达的。

  • 在计算机中参与运算的数值数据有两种:无符号数据(Signed)和带符号数据(Unsigned)。对于无符号数据,所有的二进制数据位数均用来表示数值本身,没有正负之分。而对于带符号数据,则其二进制数据位,除了必须表明其数值大小,还必须保留正负符号的位置或者隐含表明数值的正负。因此,在计算机中,机器字长相同时,无符号数据和带符号数据的表示范围是不同的。

    由于计算机中用二进制来表示所有的信息,因此,带符号数据的“+”、“-”符号也必须转化为“0”、“1”代码。这种把“+”、“-”符号代码化,并保存在计算机中的数据,称为机器数。与之对应的,我们称机器数所真正表示的有数值大小及正负的数据为真值,一般使用数值(二进制或十进制)前冠以“+”、“-”符号这种方法来书写。

  • 存储时,计算机硬件无需区分是无符号数据还是带符号数据,但在运算或者执行比较跳转操作时,则通过程序中不同的指令来区分是无符号数据还是带符号数据

  • 实际上,二进制位串本身并没有某种特定的含义,它们既可以用来表示带符号整数,也可以用来表示无符号整数,还可以用来表示浮点数或者字符串,甚至可以表示机器指令等。至于它们表示什么含义,取决于指令或者计算机对它们执行何种操作。 在一些高级语言中,通过数据类型来很好的反映这种区别。

小数点的表示方法

  • 计算机中没有专用的部件用来表示小数点。小数点及其位置是隐含规定的。小数点的隐含约定方法有两种:定点和浮点。

定点表示法

  • 定点表示法约定所有机器数的小数点的位置是固定不变的,可以分为定点小数定点整数两种。

  • 定点整数则用于表示纯整数,其小数点位置隐含固定在最低位之后,最高位仍是符号位Xs,后面的 X1……Xn均为有效的数值位。 显然,定点整数的精度 δ=1,n+1 位定点整数所能表示的绝对值最大的数是 2n-1(补码除外)。 在这里插入图片描述

  • 定点小数用于表示纯小数,其小数点位置隐含固定在符号位 Xs(最高位)之后,即使用整数位来存放符号位。n+1 位定点小数的所能表示的最精确的数是±0.00……01B,其绝对值称为定点小数的分辨率或表示精度 δ,即 δ=2-n。精度 δ 决定了它所能表示的绝对值最小的非零值,也就是在数轴上最靠近原点 0 的两个数据。n+1 位定点小数所能表示的绝对值最大的数是 0.11……11B(补码除外),即 1-2-n

    对于超出定点小数表示范围的情况,称为发生溢出。若小于定点小数的精度 δ,称为**“下溢”,数据作为零处理**;对于绝对值超出1-2-n的数据,机器将无法表示,称为**“上溢”**,简称“溢出”。
    在这里插入图片描述
    定点计算机是按照定点数的数据处理规则来设计硬件的,它可以处理的定点机器数有三类:无符号整数、有符号定点整数、有符号定点小数。硬件对这三类数据的处理并无区别,选择使用哪一种数是程序中约定的,即程序员必须事先明确自己程序中所处理的对象属于哪种类型。

    **定点计算机中,必须通过软件来设定一个比例因子,把数据适当缩小或者放大,使之变成约定好的纯小数或者纯整数;处理结束后,再使用同样的比例因子将结果还原。**但是,定点计算机中如果比例因子选择的不合适,运算结果可能会发生溢出或者降低运
    算结果的有效精度。

浮点表示法

在这里插入图片描述

  • 浮点机器数将上述的“比例因子”放在了数据之中,称为“阶码”,数据的小数点位置由阶码规定。

  • 浮点数 N 由三部分来决定其数值大小:阶码 E、尾数M 和阶码的底 R。

    在计算机中,阶码的底 R 隐含表示。浮点数实际上由定点数组成:它的阶码是定点整数,它的尾数是定点小数

  • 在选择计算机的数值数据的表示方式时,需要考虑的因素:

    要表示的数的类型(小数、整数、实数、复数)
    可能遇到的数值范围;
    数值精确度;
    数据存储和处理所需要的硬件代价。

  • 无论是采用定点整数还是定点小数,或是浮点数,计算机所能表示的数据都是一系列离散的点,至于存在于两个点之间的数据,计算机通常采用合适的舍入操作,选取最近似的值来替代。

    无论是采用定点整数还是定点小数,或是浮点数,计算机硬件的字长是有限的,当数据超出了机器数所能表示的最大界限时,计算机必须能够产生“溢出”的异常报告。

    浮点数和定点数不同的是:后者可表示的点在数轴上是均匀的,距离是等长的 1(定点整数)或者 2-n(定点小数);而后者则是分布不均匀、距离不相等的。

定点机器数表示方法

原码表示法

  • 原码表示法是一种最简单、最接近真值原型的一种表示方法,它只需将真值中的符号位直接用“0”或“1”来表示即可,正号“+”用“0”来表示,负号“-”用“1”来表示,数值部分与绝对值一致。
  • 原码数学定义
    对于n位的定点整数X,其真值的二进制表示为X=±X1X2…Xn,则其原码机器数(n+1位)为
    在这里插入图片描述
    对于n位的定点小数X,其真值的二进制表示为X=±0﹒X1X2…Xn,则其原码机器数为
    在这里插入图片描述
  • 原码表示方法
    对于定点整数:
    若 X=+X1X2…Xn,则[X]= 0,X1X2…Xn; 若 X=-X1X2…Xn,则[X]=1,X1X2…Xn

对于定点小数:
若 X=+0.X1X2…Xn,则[X]原= 0.0﹒X1X2…Xn
若 X=-0.X1X2…Xn,则[X]原= 1.X1X2…Xn

值得注意的是,以上原码的表示中,“,”和“﹒”是在书写时为区分正数和负数而特意加入的标识符号,在机器中并没有(也不需要)特殊器件用来表示它们。

  • 原码特点
    真值“0”的表示: 真值“0”既可以使用正数的原码定义公式来表示,也可以使用负数的原码定义公式来表示,前者称之为“+0” ,后者称之为“-0”,表示如下: [+0] = 0,00…0 [-0] =1,00…0.因此,真值“0”的原码表示不唯一,它占用了两个二进制编码。

    表示范围:
    对于 n+1 位的原码机器数[X]=
    X0X1X2…Xn,其中X0是符号位,则: 若 X 是定点整数,则 n+1 位的原码机器数表示范围为-(2n-1)≤X≤(2n-1);
    若 X 是定点小数,则 n+1 位的原码机器数表示范围为 -(1-2-n) ≤X≤1-2-n

    当机器遇到一个超出它的机器数表示范围的数据时,即该数据大于机器数所能表示的最大(正)数,或者小于机器数所能表示的最小(负)数,称为发生了溢出。当大于最大(正)数时,称为正溢出;小于最小(负)数时,称为负溢出。机器发生溢出时,必须根据指令进行溢出处理。

    原码运算:
    由于原码最直观地反映了真值的绝对值大小和符号,因此,使用原码进行加减乘除运算,其规则类似于真值的加减乘除运算,即:**符号位单独处理,不能参加运算,参加运算的是绝对值。**对于加减运算,首先根据符号位决定进行的是绝对值的加还是减,然后进行绝对值的加减运算,最后根据绝对值的大小决定结果(和或者差)的符号。对于乘除运算,首先进行绝对值的乘除运算,然后根据符号位决定结果的符号。

补码表示法

  • 补码表示法是计算机中最广泛应用的一种机器数表示方法,它能将减法用加法来实现。仍用“0”来表示正号“+”,用“1”来表示负号“-”,数值部分的表示则有别于原码。

  • 补数:只要确定了模,就可以找到一个与负数等价的正数来代替此负数。

  • 补码数学定义
    对于n位的定点整数X,其真值的表示为X=±X1 X2…Xn,则其补码机器数定义为(相对与2n+1做补))
    在这里插入图片描述
    从模除运算(做除法取余)的角度来看,n 位定点整数的补码机器数(n+1 位)的模为 2n+1,因此,补码机器数的定义也可以写成:
    在这里插入图片描述
    对于n位的定点小数X,其真值的表示为X=+0.X1X2…Xn,则其补码机器数定义为
    在这里插入图片描述同理,n+1 位定点小数的补码机器数的模为 2,因此,补码表示又称为“2 的补码
    在这里插入图片描述

  • 补码表示方法
    对于定点整数:
    若 X=+X1X2…Xn,则[X]=0,X1X2…Xn;若 X=-X1X2…Xn,则[X]=1,X1#X2#…Xn#+1。

    对于定点小数:
    若 X=+0.X1X2…Xn,则[X]=0.X1X2…Xn; 若 X=-0.X1X2…Xn,则[X]=1.X1#X2#…Xn#+1000…01 。

  • 补码特点
    真值“0”的表示:
    [+0]补 = [-0]补 = 000…0 ,因此,真值“0”的补码表示唯一,它只占用了一个全“0”的二进制编码。

    表示范围:
    对于 n+1 位的补码机器数[X]= X0X1X2…Xn,其中 X0是符号位,则: 若 X 是定点整数,则 n+1 位的补码机器数表示范围为-2n≤X≤2n-1; 若 X 是定点小数,则 n+1 位的补码机器数表示范围为 -1≤X≤1-2-n。 与原码表示法相比,补码表示的整数和小数范围在负方向分别多了一个值:-2n和-1,原因是真值“0”只占用一个编码,另一个在原码中表示“-0”的编码则用来表示值-2n和-1

  • 补码运算:
    由于补码的模除性质,因此,使用补码进行加减运算非常方便,补码的符号位同数值位一起参加运算,而且可以将减法转化为加法,简化了运算器的结构。对于乘除运算,也都有相应的算法实现整个补码(符号位和数值位)一同参加运算。因此,对于补码的加减乘除运算来说,参加运算的是补码本身。补码的这一特性,使得现代计算机中均采用补码机器数来表示带符号数据。

反码表示法

  • 反码数学定义
    对于n位的定点整数X,其真值的表示为X=±X1X2…Xn,则其反码机器数定义如式

    同补码类似,反码也有模除概念,n 位定点整数的反码机器数(n+1 位)的模为 2n+1-1,因此,反码的机器数定义为:
    在这里插入图片描述
    对于n位的定点小数X,其真值的表示为X=±0.X1X2…Xn,则其反码机器数定义为:
    在这里插入图片描述
    同上,n+1 位定点小数的反码机器数的模为 1,因此,反码又称为“1 的补码”
    在这里插入图片描述

  • 反码表示方法
    对于定点整数:
    若 X=+X1X2…Xn,则 X=0,X1X2…Xn;若 X=-X1X2…Xn,则X=1,X1#X2#…Xn#。

    对于定点小数:
    若 X=+0.X1X2…Xn,则X=0.X1X2…Xn
    若 X=-0.X1X2…Xn,则X=1.X1#X2#…Xn#。

  • 反码特点
    真值“0”的表示:
    真值“0”的反码表示不唯一: [+0] = 000…0,[-0] = 111……1 。因此,反码的真值“0”占用了两个二进制编码:全“0”和全“1”。

    表示范围:
    反码的表示范围等同原码。对于 n+1 位的反码机器数[X]= X0X1X2…Xn,其中 X0是符号位,则:若 X 是定点整数,则 n+1 位的原码机器数表示范围为-(2n-1)≤X≤(2n-1);
    若 X 是定点小数,则 n+1 位的原码机器数表示范围为 -(1-2-n) ≤X≤1-2-n

    反码运算:
    由于反码也具有模除性质,因此,反码的加减运算规则类似于补码,即反码的符号位和数值位一同参加运算,而且也可以将减法转化为加法,但由于反码的模比补码的模少 1,因此,补码每当运算结果大于模(2 的整数倍)时,模会产生自动溢出丢失,而反码运算时,每当有进位产生(结果大于补码的模)时,必须在末位加 1,补回反码和补码的模之间的差值 1。因为反码多用于在真值和补码之间进行转换,所以一般不使用反码实现乘除运算。

移码表示法

  • 移码表示法主要用于浮点机器数的阶码,因此它一般只用来表示定点整数。与其它三种定点机器数不同的是:移码用“1”来表示正号“+”,用“0”来表示负号“-”,数值部分的表示等同于补码。

  • 移码数学定义
    对于n位的定点整数X,其真值的表示为X=±X1X2…Xn,则其移码机器数定义为:
    在这里插入图片描述
    由定义可知,移码将真值在数轴上右移了 2n个数值,即把负端的数据全部移到了正端,因此被称为“移码”,又叫“增码”。
    将该式与补码定义的式比较,可以推导出:在这里插入图片描述

  • 移码表示方法
    求移码的表示形式只需将补码的符号位取反即可。
    若 X=+X1X2…Xn,则[X]=1,X1X2…Xn;若 X=-X1X2…Xn,则[X]=0,X1#X2#…Xn#+1。

  • 移码特点
    真值“0”的移码表示是唯一的:[+0]移 = [-0]移 =10 00…0。

    移码的表示范围等同于补码的表示范围:对于 n+1 位的移码机器整数[X]= X0X1X2…Xn,其中 X0是符号位,表示范为-2n≤X≤2n-1;-2n的移码表示全为0。

    因为移码表示和补码表示只有符号位相反,所以使用移码可以很方便地进行浮点数阶码的比较运算无论正负,从符号位开始,逐位比较大小即可;而负数的补码、原码和反码却不能够这样比较。

    对于移码加减运算也类似于补码,移码的符号位同数值位一起参加运算,而且也可以将减法转化为加法,但运算结果需要把符号位取反。

定点机器数转换

  • 机器数转换为真值
    四种定点机器数转换为真值的方法要点是:首先根据机器数的符号位确定真值的正负,然后对照机器数的定义和表示,反方向求出真值的绝对值

    原码:假设[X] = X0 ,X1X2…Xn, 若 X0 =0,则 X=+ X1X2…Xn; 若 X0 =1,则 X=- X1X2…Xn

    补码:假设[X] = X0 ,X1X2…Xn, 若 X0 =0,则 X=+ X1X2…Xn; 若 X0 =1,则X=-(X1#X2#…Xn#+1)。

    反码:假设[X] =X0 ,X1X2…Xn, 若 X0 =0,则 X=+X1X2…Xn; 若 X0 =1,则 X=-X1#X2#…Xn#

    移码:假设[X] =X0 ,X1X2…Xn, 若 X0 =1,则 X=+ X1X2…Xn ; 若 X0 =0,则 )X=-(X1#X2#…Xn#+1)。

  • 机器数之间的相互转换
    原码、补码、反码和移码之间的相互转换,最简单的方法是先求出它们的真值,然后再转换为另一种表示方法。

浮点机器数表示方法

浮点数的格式

  • 浮点机器数 N 由阶码 E(Exponent)、尾数 M(Mantissa)和阶码的底 R(Radix)三部分组成,其中 R 是一个常数,在一台机器中隐含规定,一般为 2、8 或 16。
    在这里插入图片描述

  • 浮点数中,尾数 M 是一个定点小数,它决定了浮点数有效数值的精度,尾数的符号代表了浮点数的正负,因此又称为数符。

  • 在机器中,为了方便浮点数大小的比较,通常将数符放置在浮点数的首位,将阶码(指数)放置在尾数(有效数位)之前。

  • 尾数一般采用原码和补码表示阶码 E 是一个定点整数,它对浮点数的表示范围起决定性作用。**阶码的数值大小决定了该浮点数实际小数点位置与尾数的小数点位置(隐含)之间的偏移量。**阶码的符号叫阶符,阶符为正,表明实际小数点位置在尾数的小数点位置的右边;阶符为负,则表明实际小数点位置在尾数的小数点位置的左边。阶码一般采用移码和补码表示。

  • IEEE754 标准规定了常用的 3 种浮点数格式,基数(阶码的底)隐含为 2。
    在这里插入图片描述
    其中,短实数又称为单精度浮点数,长实数又称为双精度浮点数。

    单精度浮点数和双精度浮点数的阶码采用移码,但它的偏移量不是 27和 210,而是 27-1=127 和 210-1=1023;

    尾数使用原码表示,且采用隐藏位,也就是将规格化浮点数尾数的最高位的“1”省略,不予保存,认为它隐藏在尾数小数点的左边,从而使有效位数又增加了一位。由此,推导出它们的真值计算公式,其中 E 为阶码 ESE1…Em的加权求和的值。

    临时实数主要用于进行浮点数运算,保存临时的计算结果。通常在计算前单精度和双精度数据转化为临时浮点数,参加浮点数运算,运算结果通过舍入再还原,为了便于计算,临时实数不采用隐藏位

浮点数的规格化表示

  • 为了充分利用尾数的二进制数位来表示更多的有效数字,通常采用规格化形式表示浮点数,即将尾数的绝对值限定在某个范围之内。

  • 若阶码的底为 2,则规格化浮点数的尾数 M 应满足条件: 1/2≤M≤1 。为便于计算机硬件对尾数的机器数形式的规格化判断,通常采用下列方法实现判定:

    对于原码表示的尾数,当最高有效位(M1)为 1 时,浮点数为规格化,即尾数为
    ×.1×…×形式;

    对于补码表示的尾数,当符号位(MS)与最高有效位(M1)相异时,浮点数为规格化,即尾数为 0.1×…×形式或者为 1.0×…×形式。

    所以,对于原码和补码表示的尾数,规格化浮点数要求的尾数表示范围是不同的。 对于非规格化浮点数,可以通过修改阶码和左右移尾数的方法来使其变为规格化浮点数,这个过程叫做规格化;若尾数进行右移实现的规格化,则称为右规;若尾数进行左移实现的规格化,则称为左规。

    对于原码表示的尾数,当最高有效位为 0 时,必须进行左规,尾数每左移 1 位,阶码减 1,直至尾数变为×.1×…×形式;对于补码表示的尾数,当符号位与最高有效位相同时,也必须左规,即尾数每左移 1 位,阶码减 1,直至把尾数中第一个不同于符号位的“0”或“1”移至最高有效位,变为 0.1×…×形式或者为 1.0×…×形式。

    只有当在浮点数的运算过程中,尾数发生了溢出,即超出了尾数所能表示的数据范围时,才需要进行右规处理,即尾数右移 1 位,阶码加 1,由于参加运算的浮点数必须是规格化的,因此,一般只需右规一次即可。

    浮点数的溢出是由阶码是否溢出决定的,而非尾数,尾数发生溢出可以通过右规处理,只有阶码发生溢出,浮点数才被判定为溢出。

  • 使用规格化的浮点数表示数据有如下优点:

    由于去掉了尾数中的前导 0,使得整个机器字中可以有更多的位数来存放有效数字,从而提高了浮点数据的精度;

    使程序能够更方便地交换浮点数据;

    由于所有数据采用统一的规格化表示法,这可以使浮点数的运算更为简化。

浮点数的表示范围

  • 在浮点数的表示范围中,有两种情况被称为机器零:

    若浮点数的尾数为零,无论阶码为何值;

    当阶码的值遇到比它能表示的最小值还要小时(阶码负溢出),无论其尾数为何值。
    在这里插入图片描述

  • 如图所示,浮点数的表示范围通常由四个点界定:最小(负)数、最大负数、最小正数、最大(正)数。其中,最大负数又称为负精度-δ ,最小正数称为正精度+δ ,它们是浮点数所能表示的最精确的值,相当于浮点数的分辨率。

  • 位于最大负数和最小正数之间的数据(除 0 外),浮点数无法表示,称为下溢。对于下溢的处理,计算机直接将其视为机器零。当一个数据大于最大(正)数,或者小于最小(负)数时,机器无法表示,称为上溢,上溢又称溢出。

  • 浮点数的表示范围与阶码的底 R、阶码和尾数的位数及采用何种机器数编码有关。对于等长的浮点数而言,阶码和尾数的位数分配不同,则其表示范围不同;若阶码和尾数的机器编码不同,则表示范围也不同;规格化和非规格化表示的范围也不同。

    对于等长的浮点机器数和定点机器数,浮点机器数的范围一定比定点机器数的表示范围大,而有效数值的精度却低于定点机器数。

    同理,对于等长的浮点机器数,其阶码位数越长,表示范围也越广泛,相对精度受到影响;而尾数位数越长,表示的精度越高,但表示范围相比缩小。虽然前者能够表示的绝对值最小的数比后者要小,但是前者在数轴上点与点之间的平均距离明显比后者大,即精度低。这是因为浮点数位数相同,两者能表示相同个数的数据,但是显然前者的表示范围更大,所以相邻点之间的平均距离也更大。因此必须协调好浮点数的阶码和尾数位数,以保证在有限位数的前下,既扩大数的表示范围,又能保持适当的表示精度。

  • 定点数与浮点数的比较
    在这里插入图片描述

非数值数据的表示

这些信息在计算机中也必须以二进制代码形式存在,它们的表示在本质上也同样是对信息的编码。

字符编码

  • 字符编码方式有很多种,现在应用最广泛的是美国国家信息交换标准字符码,简称ASCII(American Standard Code for Information Interchange)码。

  • ASCII 码用 7 位二进制代码表示一个字符,因此,它可以表示 128 个常用字符。包含了 95 个可打印字符和 33 个控制字符。

    在早先的系统中,在 7 位 ASCII 码最左边添加 1 位奇偶校验位,则一个字符使用一个字节来表示。在现代 PC 机中,将“1”放在 7 位 ASCII 码最左边的位上,用于选择扩展的ASCII 字符集。它们的字符编码为 80H~FFH,用于保存一些非英文字母和标点、希腊字符、算术字符、图框符及其他特殊字符。

    如果 ASCII 数据用于打印机,则其最高有效位为 0 时,打印字符;最高有效位为 1 时,打印图形。扩展字符可能随打印机的不同而不同。

  • 许多基于Windows 的应用程序使用单一码制(Unicode)存储字符数据,每个字符使用16 位存放。代码 0000H~00FFH 与标准的 ASCII 码相同,其余的代码 0100H~FFFFH 就可以用来存放世界范围内采用的字符集的专用字符,比如汉字内码。这样,为 Windows 环境编写的软件就可以在世界上许多国家内使用。

汉字编码

对于汉字,计算机的处理技术必须解决三个问题:汉字输入、汉字储存与交换、汉字输出,它们分别对应着汉字输入码、交换码、内码、字形码的概念。

  • 汉字输入码
    在西文标准键盘上,通过不同的字符组合,将汉字输入计算机,变为汉字内码的过程,称为汉字输入。汉字输入码就是指那些由不同的西文字符组合成的编码。 汉字输入的编码方法,基本上都是采用将音、形、义与特定的键相联系,再根据不同汉字进行组合来完成汉字的输入的。 不同的汉字输入法对应着不同的汉字输入法程序,输入法程序的功能就是将键盘输入的一串字符串(即汉字输入码)转化为汉字的机器内码。

    数字编码:对每个汉字采用一个数字串编码,例如区位码、国标码、电报码等等。 数字编码输入的优点是无重码,且输入码与内码的转换非常方便,缺点是代码难以记忆,输入速度较慢。

    拼音编码:拼音编码是以汉字拼音为基础的输入方法。当有同音字时,通过键盘做出序号选择。拼音输入法方案众多,目前常见的有全拼输入法、智能 ABC 输入法、微软拼音输入法、紫光拼音输入法等等。 使用简单方便,无需记忆,但汉字同音字太多,输入重码率很高,同音字选择影响了输入速度。

    字形编码:字形编码是用汉字的形状(笔画、部首)来进行的编码,简称形码。汉字是由许多相对独立的基本部分组成的。将数量众多的汉字,按其构成规则和笔划划分成有限数量的构件(字根和笔划),用字母或数字进行编码,再由这些编码组合成汉字。在输入一个汉字时,按笔划的顺序依次输入,就能表示一个汉字。常用的字形编码有五笔字型输入法、郑码输入法等等。 字形输入法通常需要一定的学习、记忆、训练过程,才能使用,但其重码较少,且不受方言影响,输入速度较快,比较受到欢迎。

    音形编码:音形编码利用音码和形码各自的优点,兼顾了汉字的音和形,将二者混合使用,以音为主,以形为辅,目的是减少编码中死记的部分,提高输入效率,易学易记。

    自然码:是目前比较常用的一种混合码。这种输入法以音码为主,以形码作为可选辅助编码,而且其形码采用“切音”法,解决了不认识的汉字输入问题。 音形输入法的特点是速度较快,又不需要专门培训。适合于对打字速度有些要求的非专业打字人员使用,如记者、作家等。相对于音码和形码,音形码使用的人还比较少。

  • 汉字交换码
    汉字交换码是指不同的具有汉字处理功能的计算机系统之间在交换汉字信息时所使用的代码标准。目前国内计算机系统所采用的标准信息处理交换码。该字符集共收录了 6763 个汉字和 682 个图形符号。6763 个汉字按其使用频率和用途,又可分为一级常用汉字 3755 个,二级次常用汉字 3008 个。其中一级汉字按拼音字母顺序排列,二级汉字按偏旁部首排列。采用两个字节对每个汉字进行编码,每个字节各取七位,这样可对 128×128=16384 个字符进行编码。

    GB2312-80 规定,所有的汉字及符号组成一个 94 ×94 的方阵。在此方阵中,每一行称为一个“区”,每一列称为一个“位”。这个方阵实际上组成一个有 94 个区(编号 01~94),每个区有 94 个位(编号 01~94)的汉字字符集。一个汉字所在的区号和位号的组合就构成了该汉字的“区位码”。其中,高两位为区号,低两位为位号。这样区位码可以唯一地确定某一汉字或字符;反之,任何一个汉字或符号都对应一个唯一的区位码,没有重码。 但是在进行汉字通信传输时,区位码可能与通信使用的 ASCII 控制码(0~31)发生冲突, ISO2022 规定每个汉字的区号和位号必须分别加上 32,即区号和位号编码为 33~126,经过这样的处理而得的代码称为国标交换码,简称国标码。即国标码=区位码+2020H,占用两个字节。

  • 汉字内码
    汉字内码是用于汉字信息的存储、交换、检索等操作的机内代码,一般采用两个字节表示。内码在计算机中是唯一的。 西文字符的机内代码是七位的 ASCII 码,当用一个字节表示时,最高位为“0”。为了与西文字符能混合使用并相互区别,汉字机内代码规定:将汉字国标码两个字节的最高位均置为“1”。即汉字机内码=汉字国标码+8080H

  • 汉字字形码
    目前的汉字处理系统中,字形信息的表示大体上有两大类:一类是用活字或文字版的母体字形形式,另一类是是点阵表示法、矢量表示法等形式,其中最基本的,应用也最广泛的是字模码。

    字模码点阵形式表示与存储汉字字形代码,它是汉字的输出形式,用于汉字的显示和打印。 点阵字形是将字符的字形分解成若干“点”组成的点阵,将此点阵置于网状上,每一小方格是点阵中的一个“点”,点阵中的每一个点可以有黑白两种颜色,有字形笔画的点用黑色,反之用白色,这样就能描写出汉字字形了。汉字字形存储时,用二进制的“1”表示黑色点,用“0”表示没有笔画的白色点,用若干个字节顺序存储这些位,构成了汉字字模码。将所有汉字的字模点阵代码按顺序集中存放,构成了汉字库。当显示输出或打印输出时才按内码检索字库,输出字模点阵,得到字形,送往显示器显示或打印机打印。字形检索程序将汉字的机内码转化为汉字的字形码

    根据汉字输出的要求不同,点阵的多少也不同。字模点阵的信息量很大,因此所占存储空间也很大。一般有简易型汉字 16×16、普及型汉字 24×24、提高型 32×32、精密型 48×48 等几种点阵,所占空间分别为 32 字节/汉字、72 字节/汉字、128 字节/汉字、288 字节/汉字。点阵越大,描述的字形越细致美观,质量越高,所占存储空间也越大。

    一个计算机汉字处理系统常配有宋体、仿宋、黑体、楷体等多种字体的汉字库。同一个汉字不同字体的字形编码是不相同的。 汉字点阵字形的汉字库结构简单,但**是当需要对汉字进行放大、缩小、平移、倾斜、旋转、投影等变换时,汉字的字形效果就欠佳。**此时,可使用矢量汉字库、曲线字库的汉字,其字形用直线或曲线表示,能产生高质量的输出字形。

校验码

  • 计算机系统中,在存取、读写和传送数据的过程中,都有可能因为某种随机干扰而产生各种错误。为了防止错误,可将数据信号采用专门的逻辑线路进行编码以检测错误,甚至纠正错误。

  • 校验码就是一种具有发现某些错误或自动改正错误能力的一种数据编码方法。它的基本思想是“冗余校验”,即通过在有效信息代码的基础上,添加一些冗余位来构成整个校验码。这些冗余位又称校验位,将其与有效信息按照一定的规律编码,形成校验码存储或发送。当在读取或接收时,再按同一约定的规律译码,首先判断出约定的规律有无被破坏:若被破坏,则表明收到的信息有错,对于只具有检错能力的校验码,则通知系统信息不可取;对于具有纠错能力的校验码,还可以纠正错误。若没有被破坏,表明数据正确,再将校验码中的有效信息部分提取出来使用。

  • 在一种编码中,在任何两个代码之间逐位比较,对应位值不同的个数,称为这两个代码之间的距离。一种码制的码距则是指该码制中所有代码之间的最小距离。 一般的二进制编码的码距等于 1,它不具有检错纠错能力。

  • 当添加了一些校验位后,编码变长了,但编码的个数没变,编码的规律使得校验码的合法码字的码距扩大了,超过了 1,此时,合法码中出现一位错误时就成为非法代码。校验码的校验原理就是通过判断代码的合法性来检错的。因此,只有当码距大于等于 2 时,校验码才具有检错能力,当码距大于等于 3 时,校验码才具有纠错能力。校验码的检错纠错能力与码距的关系如下:

    若码距 d 为奇数,如果只用来检查错误,则可以发现 d-1 位错误;如果用来纠正错误,则能够纠正(d-1)/2位错误。
    若码距 d 为偶数,则可以发现d/2位错误,并能够纠正( d/2-1 )位错误。

奇偶校验码

  • 在有效信息位的前面或者后面添加一位奇(偶)校验位就组成了奇(偶)校验码。奇(偶)校验码的编码和译码在硬件上通常采用异或非门(异或门)实现。
  • 编码
    奇校验位的取值应该使整个奇校验码中“1”的个数为奇数,偶校验位的取值应该使整个偶校验码中“1”的个数为偶数。
    假设在发送端,要发送七位 ASCII 码(B6 B5 B4 B3 B2 B1 B0),在 ASCII 码前面添加一位奇校验位P或偶校验位P变为一个字节的奇偶校验码,则它们的生成表达式为
  • 译码
    在接收端,必须检验接收到的校验码信息的奇偶性,对于奇校验码,校验码中“1”的个数应该为奇数,否则出错;对于偶校验码,校验码中“1”的个数应该为偶数,否则出错。设 E 奇为奇校验码出错信号,E 偶为偶校验码出错信号,为 1 出错,为 0 正确,则它们的表达式为
    在这里插入图片描述
    奇偶校验编码电路
    在这里插入图片描述
    奇偶校验译码电路
    在这里插入图片描述
  • 奇偶校验码的码距为 2,具有检查一位错误或奇数位错误的能力

海明码

  • 海明码是一种可以纠正一位差错的编码,编码效率很高。海明码将有效信息分成若干组,每组添加一个奇偶校验位进行校验,当有效信息发生变化时,在接收端这些校验位的值也发生变化,形成一个指误字,从而为检错和纠错提供信息。

  • 编码
    计算校验位的位数:假设信息位为 k 位,增加 r 位校验位,构成 n=k+r 位海明码字。若要求海明码能纠正一位错误,用 r 位校验位产生的 r 位指误字来区分无错状态及码字中 n 个不同位置的一位错误状态,则要求 r 满足(校验位数k可以确定 2r个状态,这些状态中必有一个其所有奇偶测试都是真的,于是剩下2r-1种状态,表示错误发生在哪一位): 2r≥ k + r + 1。利用该式可以计算出 k 位有效信息时,必须添加的能纠错一位的海明校验码的校验位的位数 r,当有效信息的位数很多时,海明码的编码效率很高。
    在这里插入图片描述
    确定有效信息和校验位的位置:假设 k 位有效信息从高到低为 Dk Dk-1 …D2 D1 ,添加的 r 位校验位为 Pr Pr-1 …P2 P1 ,则它们构成 n=k+r 位的海明码排列设为 Hn Hn-1…H2 H1 ,H 的下标被称为海明位号,则第 i 位的校验位 Pi必须位于位号为 2i-1的位置,即 Pi = Hj ,j = 2i-1 ,其中,i=1,2…r;有效信息则在其余的海明码位置上顺序排列。

    分组:由于海明码是分组进行奇偶校验的,每一组通过一个监督表达式来监督有效信息的变化,因此,分组必须使得监督表达式得出的指误字能够反映出错位的位号。分组的原则是:校验位只参加一组奇偶校验,有效信息则参加至少两组的奇偶校验,若 Di = Hj ,则 Di参加那些位号之和等于 j 的校验位的分组校验(11=8+2+1)。
    在这里插入图片描述

    进行奇偶校验,合成海明码:首先,按照分组和奇偶校验的规律将每个校验位的生成表达式写出,然后,再带入有效信息的值,依次得出校验位的取值,最后将校验位按各自的位置插入,与有效信息一起合成海明码。

    k=8,r=4 的海明码分组偶校验表达式
    在这里插入图片描述
    逻辑电路
    在这里插入图片描述

  • 译码:在接收端收到每个海明码后,也必须按上述分组检验每组的奇偶性有无发生变化,方法是按照监督关系式算出指误字 Sr Sr-1 …S2 S1 ,若为全零,则说明各组奇偶性全部无变化,信息正确,将相应的有效信息位析取出来使用;否则,指误字的十进制值,就是出错位的海明位号。
    在这里插入图片描述
    在这里插入图片描述

  • 假设要求海明码具有纠错一位并检错两位的能力,此时,校验位应多添加一位,用以实现对所有上述海明码位的校验,来区分两位出错和一位出错两种情况。

    若 k=8,则 r=5,有效信息和校验位的位置、分组原则、校验位 P4 P3 P2 P1的编码表达式均同上,校验位 P5位于 H13 ,则对所有的其他 12 位海明码进行偶校验。同样,在接收端译码时,指误字有 5 位,S4 S3 S2 S1的监督表达式同上,S5则对整个 13位海明码进行偶校验,当 S5S4 S3 S2 S1=00000 时,海明码正确;当S5S4 S3 S2 S1=10000 时,海明码有一位出错,即 P5(H13)本身出错;当 S5=1 且 S4 S3 S2 S1≠0000 时,海明码有一位出错,出错的海明位号由 S4 S3 S2 S1指出;当 S5=0 且S4 S3 S2 S1≠0000 时,海明码有两位出错,出错的海明位号无法确定。

循环冗余校验码(CRC)

循环冗余码 CRC(Cyclic Redundancy Code),又称为多项式码。这是因为任何一个由二进制数位串组成的代码都可以和一个只含有 0 和 1 两个系数的多项式建立一一对应的关系。

  • CRC 校验码在发送端编码和接收端校验时都可以利用一事先约定的生成多项式 G(x)来进行编码和译码。它能够纠正一位错误或者判断两位错误,检错与纠错能力取决于生成多项式 G(x)的选取。

  • 编码
    k 位要发送的有效信息位可对应于一个 k-1 次多项式 M(x),r 位冗余校验位对应于一个 r-1 次多项式 R(x)。由 k 位信息位后面加上 r 位冗余位组成的 n=k+r 位 CRC 码字则对应于一个 n-1 次多项式C(x),即: C(x)= xr • M(x)+ R(x) 。该 CRC 码称为(n,k)循环码。

    由信息位产生冗余位的编码过程,就是已知 M(x)求 R(x)的过程。在 CRC 码中可以通过找到一个特定的多项式 G(x)来实现。用 G(x)去除 xr• M(x)得到的余式就是 R(x),假设商的多项式为 Q(x),则编码过程为:在这里插入图片描述
    为产生 r 位的校验码,生成多项式 G(x)应满足以下条件:
    必须是 r 次多项式,最高项 xr 和 x0的系数为 1,即它对应的二进制编码是 r+1 位的。

    CRC 校验码的任何一位发生错误,余数不为零;且不同位发生错误,余数不同。

    对余数继续模 2 除,应使余数循环。

    注意:xr • M(x)除以 G(x)时,使用的是模 2 除,方法是:按模 2 减求部分余数,每求一位商应使部分余数减少一位;上商的规则是当部分余数的首位为 1 时,商取 1,当部分余数的首位为 0 时,商取 0;当部分余数的位数小于除数的位数时,该余数即为最后余数。模 2 减的规则同模 2 加,即按位异或,相同得 0,相异得 1。

    对于 CRC 校验码的编码实现方法:
    串行计算法就是根据 CRC 多项式定义,采用除法硬件电路实现 CRC 计算,按照一组线性反馈移位寄存器和模 2 加单元完成硬件上的除法功能。这种方法实现简单、容易理解,但是不能在高速前提下应用。
    在这里插入图片描述
    Gi 代表生成多项式 G(x)各项的系数,由于 Xr和 X0的系数必需为 1,所以 Gr=G0=1,图中省略了两个控制与门。Ri 是触发器,r(=n-k)个触发器构成寄存器 R,用于保存被除数和余数,初始值为全零。当 Rr-1=0 时,各与门输出为 0,R 为左移寄存器;当 Rr-1·=1 时,各与门输出为 G(x)编码与 Ri 进行异或运算(即模 2 减法),并左移 1位。有效信息 M(x)编码从最右边输入,前 k 次输入的是 M(x)编码,后 r 次输入的是“0”。串行 CRC 电路连续运算左移 n 次后,在寄存器 R 中为 r 位的余数,附在有效信息之后即可生成 C(x)。

    查表法是一种采用较多的软件实现方式,其代码量少,对于硬件实现来说最大的瓶颈就是需要一个极大的 CRC 查找表(LUT,Look-Up Table)。该 LUT 的大小随输入数据宽度不同而不同。对于 8 比特数据输入,其 LUT 需要为个 28 索引值;对于 16 比特数据输入,其 LUT 需要为 216个索引值。

    并行算法则是根据 CRC 多项式反馈特性,将串行的比特反馈等效成并行计算等式。

  • 译码
    在信道上发送的码字多项式为 C(x)= xr • M(x)+R(x)。若传输无错,则接收方收到的码字也对应于此多项式。将接收的码字多项式除以 G(x),可得: C(x)= xr • M(x)+R(x)= G(x)• Q(x)+ R(x)+ R(x)= G(x)• Q(x),即 C(x)/ G(x)余数为 0,或者说 C(x)能被 G(x)整除。因而接收端的校验过程就是用 G(x)来除接收到的码字多项式的过程。若余式为零则认为传输无差错,若余式不为零则传输有差错;出错的位置与余数值是一一对应的关系,通过查找出错模式表,即可以确定是那一位出错。

    G(x)的特性又使得当对余数补一个“0”,继续作模 2 除时,余数会在出错模式表中循环。该特点便于纠错电路的设计。

    CRC 译码电路可基于上图的电路进行改造而实现:输入的数据为接收到的 C(x)即CRC 编码,Gi 取与编码电路相同的生成多项式 G(x),R 寄存器初始为全零。电路进行运算移位 n 次后,R 中若变为全零则收到的 CRC 编码正确,否则控制纠错电路继续循环左移CRC 码,直到 R 中余数为特定值时,取反纠正。显然, CRC 校验码串行生成电路速度较慢,不适合高速设备和系统。

    循环冗余校验码检错能力强(能纠错 1 位),编码译码电路简单。

现代计算机系统的数据表示

  • 通常,数据以字符、BCD、有符号和无符号整数、或者浮点数的形式出现在计算机中。

  • 字符串:字符串由字符的ASCII码或者文字的Unicode编码组成,按顺序存放在内存或寄存器中。每个 ASCII 码字符占 1 个字节,每个 Unicode 编码占用 2 个字节,

  • BCD:BCD 数据分为压缩的(packed)BCD 码和非压缩(unpacked)的 BCD 码两种,前者以每字节 2 位 BCD 数字的形式存储,后者以每字节1 位 BCD 数字的方法存储。BCD 数据不适合进行复杂的算术运算,通常应用于销售终端等实现少量、简单运算的设备。

  • 指针:指针实际上是内存单元的地址,因此是无符号数据。IA 构架中定义了两种类型的指针,一种是 32 位的近指针,用于定义段内偏移量和段内访问;另一种是 48 位的全指针,又称远指针,用于段间访问。

  • 浮点数

发布了30 篇原创文章 · 获赞 1 · 访问量 391

猜你喜欢

转载自blog.csdn.net/weixin_46265246/article/details/105258697
今日推荐