您的位置:首页 > 理论基础

浮点数在计算机中存储方式

2017-07-31 14:47 295 查看
今天在研究C语言程序的时候发现了一个问题,double在C语言中占8个字节,当定义一个double变量例如:

double d=120.5;
printf("%lf",d);


输出结果为:120.500000

但是当我以字节为单位(即定义一个字符型的指针p,令p=&d;)循环访问内存中的值时,得出来的结果令人匪夷所思



这是我从变量的起始地址循环访问所得到的结果,这个结果与我们的120.5有什么关系呢?

从网上查找到的一篇博文上看到了解释,但是因为那篇博文细节上有一点小错误,虽然经过多方转载但是并没有把这个错误改正过来,所以我才打算写这篇文章纠正一下。

无论是单精度还是双精度,在计算机中的表示方法都是类似的,因为计算机只识别0和1这两个数字,所以计算机采用二进制的科学记数法来表示小数,120.5的二进制是1111000.1,科学计数法表示为1.1110001x26。

计算机把小数存储分为三部分:

1. 符号位(Sign) : 0代表正,1代表为负

2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储

3. 尾数部分(Mantissa):尾数部分



再看我们120.5的存储方式,符号位为0表示正数,指数位因为双精度的指数位占11位,所以指数位的值为:6+(210-1)=1029,尾数部分为1110001后边补0,结果如下:

0 100 0000 0101 1110 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

所以计算机的输出结果为:40 5e 20 00 00 00 00 00

我们顺便看一下单精度的输出结果,单精度和双精度只是指数部分的值不同,尾数部分的长度不同,单精度的指数位占8位,所以它的指数部分的值就是6+(27-1)=133,所以单精度的存储方式如下:

0 100 0010 1111 0001 0000 0000 0000 0000

好了,希望通过这篇文章让你在面对float或者double类型奇怪的输出时不那么害怕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息