无穷 符号 11、定点数和浮点数
我们平时都会用到小数,通常我们可以把小数表示成10的幂的形式,如12.21=1x101+2x100+2x10-1+1x10-2。但是有一些很难表示,如1/3.
小数用二进制表示的最简单的方法是BCD码,这在表示钱的时候特别有用。
通常把两个BCD数字存放在一个字节,这种方式成为压缩BCD。由于2的补数不和BCD数一起使用,因此压缩BCD通常需要增加1位用来标识数的正负,该位被称做符号位。用一整个字节保存某个特定的BCD数是很方便的,但要为这个短小的符号位牺牲4位或8位的存储空间。
看个例子,假设计算机程序所要处理的钱款数目在+/-100万之间,这就意味着范围是-9999999.99~99999999.99,因此保存在存储器中的每一笔钱的金额都需要5个字节。因此,-4325120.25可以表示为下面的5个字节:
00010100 00110010 01010001 00100000 00100101
转换成十六进制,可等价的表示成:14h 32h 51h 20h 25h
最左边的1用来表示该数是负数,符号位。
这种基于二进制的存储和标记方式称为定点格式,指小数点的位置总是在数的某个特定位置——在本例中,它位于两位小数之前。
小数点位置的计数信息并没有和整个数字一起存储,所以使用小数的程序必须知道小数点的位置。
但是如果很大的数字用这种方式来存储,就很浪费空间了。
科学家喜欢用科学计数法来表示这类数字,如490000000000可记为4.9x1011,而0.00000000026可以表示为2.6x10-10。4.9、2.6被称作有效数,11、-10被称作指数。一般规定有效数的取值范围大于等于1小于10.
计算机中,对于小数的存储方式,除了定点格式外还有另外一种选择,称为浮点格式。因为浮点格式是基于科学计数法的,它是存储极大或极小数的理想方式。但计算机中的浮点格式是借助二进制数实现的科学计数法形式,因此我们首先要了解如何用二进制表示小数。
十进制中,小数点右边的数字与10的负整数次幂相关联;而在二进制数中,二进制小数点右边的数字和2的负整数次幂相关。如101.1101可以转换成1x22+0x21+1x20+1x2-1+1x2-2+0x2-3+1x2-4。观察下负整次幂,可以发现都是从1开始反复除2得到下一位。如2-1=>0.5,2-2=>0.25,2-3=>0.125,2-4=>0.0625。同十进制一样,一般有效数大于等于1且小于10(十进制2),如101.1101=》1.011101x22,可以发现,每次小数点左边都是1,没其他数字。
IEEE浮点数标准定义了两种基本的格式:以4个字节表示的单精度格式和以8个字节表示的双精度格式。
首先了解下单精度格式。它的4个字节可以分为三个部分:1位的符号位(0代表正数,1代表负数),8位用做指数,最后的23位用做有效数。下面给出了单精度格式的三部分的划分方式,其中有效数的最低位的最右边。
三部分共32位,小数点最左边的1并没有存储,因为它总是1。尽管存储只有23位有效数,但仍然称其精度为24位。
8位指数部分的取值范围是0~255,称为偏移指数,它的意思是:对于有符号指数,为了确定其实际所代表的值必须从指数中减去一个值——称做偏移量。对于单精度浮点数,其偏移量为127。
指数0和255用于特殊的目的,后面介绍。如果指数的取值范围是1~254,那么对于一个特定的数,可以用s(符号位),e(指数)以及f(有效数)来描述它:(-1)sx1.fx2e-127。
1.f,小数点后面跟着23位有效数。1.f与2的幂相乘,其中指数等于内存中的8位偏移指数减去127。
大家觉得你非常好