计算机组成原理第 21 节

本贴最后更新于 2300 天前,其中的信息可能已经斗转星移

数据格式

先说下数据格式,在选择计算机数的表示方式时,需要考虑以下几个因数:

  1. 要表达的书的类型(小数,整数,实数,复数)
  2. 可能遇到的数值范围
  3. 数值精度
  4. 数据存储和处理所需要的硬件代价

计算机中常用的数据表示格式有两种,一是定点格式,二是浮点格式。

定点数的表示方式

所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。通常将数据表示成纯小数纯整数

用一个 n+1 位数来表示一个定点数 X,其中一位 Xn 用来表示数的符号,其余数代表他的量值。为了将整个 n+1 位统一处理,符号位 Xn 放在最左位置,并用数值 01 分别代表正号和负号,这样,对于任意定点数 X = Xn Xn-1 …… X1 X0,在定点机中可以表示位如下形式:

纯小数

如果数 X 表示是纯小数,那么小数点位于 XnXn-1 之间。当 XnXn-1……X1X0 各位均为 0 是,数 X 的绝对值最小,即 |X|min = 0;当各位均为 1 时,X 的绝对值最大,即 |X|max = 1-2^-n,故数的表达范围为

纯整数

如果数 X 表示纯整数,那么小数点位于最低位 X0 的右边,此时数 X 的表示范围为:

浮点数的表示方式

浮点表示法:把一个数的有效数字和数的范围在计算机的一个存储单元中分别予以表示。这种把数的范围和精度分别表示的方法,相当于数的小数点位置随比例影子的不同而在一定范围内自由浮动。

eg:

9 X 10^-28 = 0.9 X 10^-29

因此任意一个十进制数 N 可以写成:

同样的,在计算机中,任意一个二进制数 N 可以写成

其中,M 成为浮点数的 尾数,是一个纯小数。e 是比例因子的指数,称为浮点数的 指数,是一个整数。比例因子的 基数 2 对二进计数制的机器是一个常数。

在机器中表示一个浮点数时,一定要给出尾数,用定点小数形式表示。尾数部分给出有效数字的尾数,因而决定了浮点数的表示精度。二是要给出指数,用整数表示,常称为阶码,解码指明小数点在数据中的位置。浮点数也要有符号位。

早期表示:

后来为了方便软件移植,按 IEEE754 标准,32 位浮点和 64 位浮点的标准格式位:

  • 不论是 32 位浮点还是 64 位浮点,基数 2 是固定常数,每一个浮点数都一样,所以不用显示表示。
  • 32 位浮点数中,S 是浮点数的符号位,占一位,在最高位,S = 0 表示正数,S = 1 表示负数
  • M 是尾数,放在低位部分,占用 23 位,小数点位置放在尾数域最高有效位的右边
  • E 是阶码,占用 8 位,阶符采用隐含方式,即采用移码的方式表示正负指数
  • 浮点数的指数真值 e 变成阶码 E 时,应将指数 e 加上固定偏移值 127(01111111),即 E = e + 127

注意:浮点数的规格化表示,要求:为了提高数据的表示精度,当尾数的值不为 0 时,尾数域的最高有效位应为 1.

因此,依照规格化后的要求,对于 阶值E尾码M 有如下范围:

在 IEEE745 标准下,一个规格化的 32 位浮点数 X 的真值表示为:

其中尾数域所表示的值是 1.M。由于规格化的浮点数的尾数域最左位(最高有效位)总是 1,故这一位经常不予存储,而认为隐藏在小数点的左边。于是用 23 位字段可以存储 24 位有效数。

同样的,64 位浮点数的区别在于,符号位 1 位,阶码域 11 位尾数域 52 位,指数偏移值 1023,e = E - 1023.

机器码

真值与机器码相对应,机器数是指:一个数在计算机中的二进制表示,叫做这个数的机器数。机器数的带符号的,在计算机用一个数的最高位存放符号,正数为 0,负数为 1.

而真值,是指没有符号位内容的值,也就是这个数本身的值(二进制形式).

对于一个数,计算机要使用一定的编码方式进行存储,原码,反码,补码是机器存储一个具体数字的编码方式。

原码

先说原码,原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如 8 位二进制:

[+1]原 = 0000 0001
[-1]原 = 1000 0001

第一位是符号位,所以 8 位二进制的取值范围是:

[1111 1111 , 0111 1111]2 即 [-127 , 127]

反码

反码的表示方式是:

  • 正数的反码是其本身
  • 负数的反码是符号不变,其余位取反

[+1] = [0000 0001]原 = [0000 0001]反
[-1] = [1000 0001]原 = [1111 1110]反

补码

补码的表示方法是:

  • 正数的补码就是其本身
  • 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后 +1. (即在反码的基础上 +1)

[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补
[-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...