计算机组成原理-运算方法之数据格式

数据格式

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

  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位浮点的标准格式位:

IEEE745
  • 不论是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的真值表示为:

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]补