计算机组成原理-数据的机器级表示与处理-第一季 数的表示


数据的机器级表示与处理

本小节主要结合C语言介绍C语言的运算及计算机内部的机器级表示和基本处理
主要内容包括:

  • 进位计数制、 二进制定点数的编码表示、无符号整数和带符号整数的表示,
  • IEEE754 浮点数表示标准、西文字符和汉字的编码表示 。
  • C语言中各种类型数据的表示和转换、数据的宽度和存放顺序、基本运算及其运算电路。
    本文会加上作者自己的理解,如有不对的地方欢迎指正。

提示:以下是本篇文章正文内容,下面案例可供参考

一、数值与编码

1. 二进制编码

(一)机器级数据分两大类:

  1. 数值数据:无符号整数、带符号整数、浮点数(实数)、十进制数
  2. 非数值数据:逻辑数(包括位串)、西文字符和汉字

(二)计算机内部所有信息都用二进制进行编码用二进制编码的原因:

  1. 制造二个稳定态的物理器件容易
  2. 二进制编码、计数、运算规则简单
  3. 正好与逻辑命题对应,便于逻辑运算,并可方便地用逻辑电路实现算术运算真值和机器数
    在这里插入图片描述
    指令所处理的数据类型分为数值数据和非数值数据两种。
  • 数值数据可用来表示数量的多少,可比较其大小,分为整数和实数,整数又分为无符号整数和带符号整数。在计算机内部, 整数用定点数表示,实数用浮点数表示。
  • 非数值数据就是一个没有大小之分的位串,不表示数量的多少,主要用来表示字符数据和逻辑数据。

在计算机内部,数值数据的表示方法有两大类:第一种是直接用二进制数表示;另一种是采用二进制编码的十进制数 (Binary CodedDecimal Number, 简称BCD) 表示。表示一个数值数据要确定三个要素:进位计数制、定/浮点表示和编码规则。
任何给定的一个二进制0/1序列,在未确定它采用什么进位计数制、定点还是浮点表示以及编码表示方法之前,它所代表的数值数据的值是无法确定的。

2. 进制的相互转换

进制的相互转换就不做讨论了,主要注意一点,小数转成二进制。看下面这个例子就可以。
在这里插入图片描述

3. 定点数与浮点数

3.1 定点数

1.定点数主要包括原码、反码、补码、移码的介绍。下面分别介绍如下所示:
原码:原码(True form): “符号-数值”表示法,符号位+绝对值的真值。浮点数的尾数采用的是原码的方式。
在这里插入图片描述在这里插入图片描述
根据上面两个图片能够看清原码的操作。原码性质:

  • 带符号的绝对值表示,符号位为“0”表示该数为正,符号位为“1”表示该数为负。
  • “0”不惟一。
  • 表示范围(机器字长为n+1):
  • 定点小数:-(1-2-n)~+(1-2-n)
  • 定点整数:-(2n-1)~+(2n-1)
  • 若字长为n,总共有2n个码点,但对应的真值只有2n-1个。
  • 负数的原码大于正数的原码。
  • 若是8位机器,能够表示的范围是-127~127

补码:计算机没法运算减法,怎么把减法转换成加法呢?这是一个值得思考的问题。例如如果是一个8位寄存器,怎么计算12-3这个数呢?我们需要首先找到模,8位寄存器的机器模是1+8个0,即256;当时小数的时候模时2;我们需要知道如果两个数互补,-3的绝对值+某一个数=256,这样我们能够求出这个数,但是这个数据的求出还需要减法,这就是一个死循环了,但是我们用的时二进制,那么求补码就很简单了,数据取反,末尾加一就可以了。补码的性质如下:

1)补码的符号位 用补码表示的数,若其最高位为“0”,则此数为正;若其最高位为“1”,则此数为负。

2)补码中0的表示: 由补码定义,[0]补=0

3)补码的表示范围: 假设机器字长为n+1,则 用补码表示的定点小数,其表示范围为: -1≤X≤+(1-2-(n));
用补码表示的定点整数,其表示范围为: -2n≤X≤+(2n-1)。 比原码多表示一个数。

4)负数的补码值大于正数的补码值 补码与真值、原码之间的相互转换 当X≥0时,X=[X]=[X] 当X<0时,如下图所示。

在这里插入图片描述

5)补码的符号位扩展 定点小数:在其低位填充适当位数的“0” 定点整数:符号位扩展


移码:移码只出现在整数中,其实计算机中采用移码来表示浮点数的阶。一般情况下移码=真值+偏移量(8位的偏移量时128,但是在IEEE中时127)浮点数实际上是用两个定点数来表示的。用一个定点小数表示浮点数的尾数,用一个定点 整数表示浮点数的阶(即指数)。 一般情况下,浮点数的阶都用一种称之为“移码”的编码方 式表示。通常将阶的编码表示称为阶码。
为什么要用移码表示阶呢?因为阶可以是正数,也可以是负数,当进行浮点数的加减运算 时,必须先“对阶”(即比较两个数的阶的大小并使之相等)。为简化比较操作,使操作过程 不涉及阶的符号,可以对每个阶都加上一个正的常数,称为偏置常数 (bias),使所有阶都转 换为正整数,这样,在对浮点数的阶进行比较时,就是对两个正整数进行比较,因而可以直观 地将两个数按位从左到右进行比对,简化了对阶操作。

3.2 C语言中的整数

整数的小数点隐含在数的最右边,故无须表示小数点,因而也被称为定点数。计算机中的整数分为无符号整数 (unsigned integer) 和带符号整数 (signed integer) 两种。C语言中如果写了一个常数,默认的值如下所示。在这里插入图片描述
在这里插入图片描述
还需要理解上图的原理。

3.3.浮点数

3.3.1 普通浮点数的表示方式。

在这里插入图片描述

在这里插入图片描述
上面这个例子中,规格化数据的格式是0.1xxxxxx。所以最大的正数就是,尾数全1 阶码全1。一般情况下阶码都是-128-127。IEEE754除外,是-127-128
左规:若采用变形补码表示尾数,则当结果的尾数出现11.1xxx…x或00.0xxx…x的形式时,需将尾数左移1位,阶码减1,直到尾数为规格化形式为止。
右规:当浮点运算结果的尾数出现01.xxx…x或10.xxx…x的形式时,并不一定溢出,应先将尾数右移1位,阶码加1,然后判断阶码是否溢出。

小总结:普通浮点数的阶码、规格化规范都是不同CPU自己确定。

3.3.1 IEEE754的表示方式。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 尾数用原码表示,小数点前隐含一个“1”。
  • 基值隐含为2。
  • 阶码用移码表示,移码的偏移值有专门约定:n位移码的偏移值为 2(n-1)-1。
  • 指数(阶码)的最大值、最小值作为特殊标记预留,用来标记某些异常事件或机器零。
    在这里插入图片描述

浮点数的溢出:数的大小超出了浮点数表示范围。原因:指数部分太大,以至于无法用有限的指数字段表示出来。
下溢:阶码小于机器能表示的最小阶码。一般当作机器零处理,机器继续运行。
上溢:阶码大于机器能表示的最大阶码。机器必须转入溢出故障的中断处理程序进行相应的处理。
如何降低上溢或下溢发生的可能性?采用双精度格式。下面的博文写的时对浮点数理解比较深的博文,可以参考。浮点数详细介绍
IEEE 754 标准规定,当指数 exp 的所有位都为 1 时,不再作为“正常”的浮点数对待,而是作为特殊值处理:

  • 如果此时尾数 mant 的二进制位都为 0,则表示无穷大:
  • 如果符号 sign 为 1,则表示负无穷大;
  • 如果符号 sign 为 0,则表示正无穷大。
  • 如果此时尾数 mant 的二进制位不全为 0,则表示 NaN(Not a Number),也即这是一个无效的数字,或者该数字未经初始化。
    当指数 exp 的所有位都为 0 时,如果尾数都是0择表示0,如果尾数不是0就表示非规格化小数,小数点前面是0.
    在这里插入图片描述

简单概念。

“字”和 “字长”的概念不同
“字长”指数据通路的宽度。
(数据通路指CPU内部数据流经的路径以及路径上的部件,主要是CPU内部进行数据运算、存储和传送的部件,这些部件的宽度基本上要一致,才能相互匹配。因此,“字长”等于CPU内部总线的宽度、运算器的位数、通用寄存器的宽度等。 )
“字”表示被处理信息的单位,用来度量数据类型的宽度。
字和字长的宽度可以一样,也可不同。
例如,x86体系结构定义“字”的宽度为16位(不变),但从386开始字长就是32位了(寄存器尾数)。存储字长是MDR的位数。16位计算机 16个寄存器 20个地址线 32位计算机都是32位 64位计算机寄存器64位,地址48位。
按多少字节对齐,其实就是说地址后面一定有几个0 ,有的地址是按照4K对齐,就是后面4位都是0。有的是16位对齐,就是最后面一位是0。32位对齐就是4个字节,后面两位是0.

PS:下一小节介绍结合C语言介绍具体运算

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值