数据的机器层次表示

数据是计算机处理和加工的基本单位和对象。在计算机中数据分为无符号数(绝对值)和有符号数(真值)。其中带符号数根据编码分为原码、反码、补码、移码。

计算机中数据的表示最基本的为二进制(B)、十进制(D)、八进制(Q)、十六进制(H),其具体转化是基于位来进行的,也就是“满十进一,满二进一”等。具体转化的简单记忆方法可以参考我的博客:进制转换详解

一、无符号数和带符号数

所谓的无符号数就是数据的所有位均为数值位(没有符号位),类似于绝对值。以下例子:

 X1 = 01001 表示无符号9; X2 = 11001 表示无符号数25.

机器字长是n+1的无符号位的表示范围为0-(2^(n+1)-1),此时的二进制最高位为数值位,其权值为2^n。

当涉及到正负数时,就需要用到我们的带符号数。所谓的带符号数就是在二进制的最高位约定为符号位:“0表示正,1表示负”。

再回到上面的例子中:

  X1 = 01001 表示有符号+9;

X2 = 11001 表示符号数-9.

因为计算机CPU的运算器中只有加法器,要把减法转化成加法来计算.引入原码 反码 和补码的目的就是为了解决减法问题,

1.1原码表示法:

若真值为纯小数:原码形式为Xs.X1X2X3…,其中Xs表示符号位,具体如下:

 

若真值为纯整数,其原码形式XsX1X2X3…,具体如图所示


原码的优点是直观易懂,机器数与真值之间简单转化。用原码实现算术乘除运算很简单,缺点是实现加减运算复杂

在原码中,真值0有两种表示方法:

[+0]原 = 00000;

[-0]原 = 10000;


1.2 补码的表示法:

小数形式反码:

 

整数形式的反码:

 


在补码表示中,真值0有唯一表示方法

[+0]补 = [-0]补 = 00000;

已知原码求补码的简单方法:对于正数,X补=X原 = X 。对负数:X补=X原 除去符号位外的各位求反后再加“1”。反之,当X为负数,已知[X]补,也可以通过对其除去符号位外的各位求反加“1”求得[X]原

当X为负数时,更为简单的求原码的方法为,自低位向高位,尾数的第一个“1”和右边的“0”保持不变,左边的各位取反,符号位保持不变。这样避免了加“1”运算。

将真值转为补码的简单方法:将自低位向高位,尾数的第一个1及其右边的“0”保持不变,左边的各位取反,负号用1表示。


1.3反码表示法

与补码的区别在于末位少加一个1.

反码的定义为:

 

在反码表示中,其真值0的表示有两种 :

【+0】反 = 00000;

【-0】反 = 11111.


二、三种机器数表示的比较转换:

2.1比较

1)三种表示方法,当真值为正数,它们都等于真值本身。

2)最高位都表示符号位。补码和反码的符号位可以作为数值位的一部分,和数值位一起参加运算。但是原码的符号位不允许和数值位同等看待。

3)对于真值0,原码和反码各有不同的表示形式,而补码只有一种。

4)原码、反码表示正负数的范围相对零来说是对称的,但补码相对于负数范围较正数范围宽,能多表示一个最负的数(绝对值最大数),其值为-2^n或者-1(小数)如下



2.2转换:


真值X和补码或反码之间的转化通常是基于原码的,



三、机器数的定点表示和浮点表示

在计算机中进行算术逻辑运算时,需要指明小数点的位置,根据小数点的位置是否固定分为定点表示和浮点表示。

3.1定点表示

3.11定点小数:即纯小数,小数点的位置笃定在最高位有效数字之前,符号位之后,记为Xs.X1X2X3…




3.1.2定点整数:即纯整数,小数点位置隐含固定在最低位有效数字之后。表示如下图:




在定点表示法中,参加运算的数以及运算的结果必须保证落在该定点数所能表示的数值范围内,否则发生“溢出”,这时计算机或出现终止运算操作,而进行溢出处理操作。



3.2、浮点表示法

在科学计算中,常常会遇到非常大或者非常小的数字,如果采用同样的比例因子来处理,很难兼顾处理精度和数值范围。为了协调这两方面,出现了浮点数表示法。


在其中,阶码必须是整数,尾数必须是小数。浮点数的表示 格式如图所示:


其中阶符和阶码的位数合起来反应的是浮点数的表示范围和小数点的实际位置。而尾数的数符和表示浮点数的符号,尾数的尾数反映浮点数的精度。

3.2.2浮点数的规格化:

为了提高运算的计算精度,需要充分利用尾数的有效位,通常通过规格化形式,也就是说,规定浮点数的尾数的最高位必须是一个有效值。如果尾数的最高位不是一个有效值,则需要通过浮点数的规格化使其变为一个有效值。

对于浮点数的规格化的一般规范为:

 规格化浮点数的尾数M的取值范围是:1/r<=|M|<=1

 若r=2,则1/2<=|M|<=1.

如果使用原码表示,则尾数的最高位必须为“1”,原码规格化之后:

正数为0.1*******的形式。其最大值为0.11111**1;最小值为:0.1000**0。所以尾数的表示范围:1/2<=|M|<=(1-(2^-n))

负数为1.1**1的形式。其最大值为1.100*0;最小值为:1.11111**1。所以尾数的表示范围:-(1-(2^-n))<=|M|<=-1/2

使用补码规格化之后:则尾数的最高有效位必须与符号位相反。

正数为0.1*******的形式。其最大值为0.11111**1;最小值为:0.1000**0。所以尾数的表示范围:1/2<=|M|<=(1-(2^-n))

**负数为1.0**1的形式。其最大值为1.01**1;最小值为:1.00*00。所以尾数的表示范围:-1<=|M|<=-(1/2+(2^-n))

**注意:补码形式的最大值负数形式中,是1.01**1的形式,而非原码形式 1.100*0,因为这已经不是补码的规格化形式。补码的尾数的最高有效位必须是与符号位相反(上图红绿色)。


2.4浮点数的表示范围:如图


2.5、IEEE 754标准

根据IEEE 754的标准,浮点数的表示格式如下:




三、非数值(字符)数据的表示。

字符数据通常是指字符、字符串、图形符号、汉字等各种数据,,一般情况下,不对他们进行逻辑或者算术运算。

3.1字符和字符串的表示

3.11,ASCII码:由7位二进制表示的0-127总的128位字符,表示十进制0-9、字母大小写52个、34个专用字符和32个控制字符组成。其中96位是可打印字符。3第2个是SP键,127值即第128位位DEL键位。如下图:


在计算机中,一个字符由一个字节来存放,其中右边的7位表示不同字符代码,左边的第1位奇偶校验码,用来检验错误,也可以用以西字符和中文汉字的区分位。

3.22、字符串的存放

字符串是指一串连续的字符,通常的他们在存储器中占用一片连续的空间,每个字节存放一个字节代码。而且,字符串的所有字符在物理存储上也是连续的。这种存储方法成为向量法。

向量法存储字符串是最为简单和节省空间的方法。但是涉及到字符串的删除和插入操作,字符串需要全部重新分配空间,所以将要花费更多的时间。为了这一缺点的克服,串表法应运而生。在串表法中,所有字符串代码的后面有一个链接字,链接字中存放下一个字符的存储单元地址。所以串表法不要求字符串之间的物理邻接。但是克服了向量法的缺点之外,这一方法也在物理空间上造成存储单元的碎片化,空间的利用率低下。

3.3、汉字的表示

汉字的编码问题是计算机遍及传播的首要克服问题。在汉字的表示中,由区位码-国标码-机内码-字形码的几种状态。

区位码:

汉字的区位码由4位字节组成。将汉字GB2312-80的6763个汉字编码成94个区,每个区中存放94个位汉字。区位组成一个二维数组。区位码中前2位表示区号,后2位是位号。区号和位号都是使用十进制表示的。区号和位号都是取值在1-94区间。例如在区位码的二维数组中,“中”在54区的48位,则“中”字的表示位“54-48“。

在区位码中,布局是由规律的,其中1-15区表示的是西文字母、数字和图形符号,以及用户自定义的专用符号;在16-55区为一级汉字;第56-87区为二级汉字;87区以上的为空白区。供新造汉字的使用。

国标码:

汉字的国标码又叫做汉字交换码。主要用于汉字信息系统之间或者通信系统之间的交换信息使用,在1981颁布的GB2312-80中,收集汉字6763个。其使用两个字节表示。所以表示的汉字范围:128*128=16384个。

机内码:

汉字可以通过不同的输入码输入,但是其在计算机内的内码是唯一的。

三者的转化:

国标码 = 区位码(16进制)+2020H。

汉字内码 = 国标码(十六进制)+8080H。


四、十进制数(BCD)和校验码

十进制数编码:我们知道二进制是计算机最适合的数据表示方法,把十进制的各位数字变成一个对应 的二进制代码,用4位二进制代码数来表示一个十进制数,称为二进制编码的十进制数。(Binary-Code-Decimal)也就是BCD码。

但是4位二进制码可以表示出16中代码,所以10-16就是冗余码,我们只要使用的是0-9的10个十进制数。一下是常见的几种BCD码:

4.1、8421码

又称为NBCD码,4位二进制数的权位分别对应位8,4,2,1.其主要特点是:

1)、它是一种有权码:设其各位的值b3b2b1b0。则它对应的十进制数:D=8*b3+4*b2+2*b1*1*b0。

2)、直观简单。每个代码与它所表示的十进制之间符合二进制和十进制的转换关系。

3)、不允许出现1010-1111之间的数字,因为这几个是非法码(冗余码)

4.2、2421码
 这种编码跟上面的类似,从高到低的权位值分别是:2,4,2,1。其主要特点是:

1)、它是一种有权码:设其各位的值b3b2b1b0。则它对应的十进制数:D=2*b3+4*b2+2*b1*1*b0。

2)、它又是一种对9的自补码。即某数的2421码,只要自身按位取反,就能得到该数对9补数的2421码。例如:3的2421码是0011,3对9的补数是6,所以把3的2421码按位取反得到1100就是其补数6的2421码。在十进制中使用自补码,可以简化运算器线路。

3)、不允许出现0101-0101,因为这是2421的非法码(冗余码)。

4.3、余3码

余3码是一种无权码,其取值是在8421码的基础上加上0011形成的。因此每个数都多余3,其主要特点是:

1)、它是一种无权码,在这种编码中的各位“1”不表示一个固定的十进制数值,因而不直观,容易出错。

2)、它是一种对9的自补码。

3)、同样的,不允许出现0000-0010、1101-1111.

4.4、十进制数串

十进制数在计算机中是以数串的形式存在的,其长度是可变的。十进制在计算机内有两种表示形式:非压缩的十进制数和压缩的十进制数。

非压缩的十进制数串其实质就是前述的字符串,即一个字节存放一个十进制数或者符号的ASCII码。在主存中,这样的十进制数串连续的占用多个字节。为了指明一个数串,需要指定该数串在主存中的起始地址和串长。非压缩的十进制数串又根据符号位所处位置,分成前分割式字串和后嵌入式数字串。符号位占用单独一个字节。放在数值位之前,正号对应的是ASCII的2BH,负号对应2DH。在后嵌入式数字串中,符号位不单独占用字节,而是嵌入到最低一位数字里面,若数串位为正数,则最低位数字的ASCII不变(30H-39H);若数串为负数,把负号变为40H,并将其加入到最低数值位,此时的数字0-9表示为:(70H-79H)。

所以,非压缩十进制数串不适用在数值运算中,因为每个字节中只有后四位表示数值。而高四位在数值运算时,不具有数值含义。

压缩的十进制数串,一个字节可以存放两位BCD码表示的十进制。既节省了存储空间,又便于直接进行十进制算数运算。

在主存中,一个压缩的十进制数串占用连续的多个字节。每位数字仅占用半个字节,其值常用8421码表示。符号位又是占用半个字节,并存放在数值位最低位之后,通常用CH代表正号,DH表示负号。同样的,要指明一个压缩的十进制数串,也必须指明在主存中的首地址和字串长度。

4.5、数据检验码

数据在传输和存储中,可能会出现差错,出现差错的原因可能会是:设备的临界工作状态、外界高频干扰、收发设备中间歇性故障等等,







猜你喜欢

转载自blog.csdn.net/sinat_38321889/article/details/79120148