寻求更好的阅读体验,请移步 :浮点数在计算机中的存储 —【Mculover666的个人博客】。

用于存储小数的数据类型是有单精度浮点型(float)和双精度浮点型(double),那么,浮点数在计算机中是以怎样的二进制代码存储的呢?

本篇将为你揭秘浮点数在计算机中的存储方式~

1. 浮点数在编程时的表示方式(书写方式)

浮点数在编程时有两种写法:

  • 传统写法:直接写(eg. 0.1234)
  • 科学计数法:用e表示(eg. 12.34e-2)

2. 十进制小数与二进制浮点数之间的转化

  • 十进制小数 -> 二进制浮点数
  • 二进制浮点数 -> 十进制小数

具体参考常用进制及其转化一文。

3. 浮点数按照IEEE 754标准存储在计算机中

IEEE 754

IEEE 754全称ANSI/IEEE Std 754-1985,是CPU和浮点运算器中广泛使用的二进制浮点算术标准

IEEE 754标准定义了表示浮点数的格式,一些特殊数值((无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”。

IEEE 754规定了四种表示浮点数值的方式:

  • 单精确度(32位)
  • 双精确度(64位)
  • 延伸单精确度(43比特以上,很少使用)
  • 延伸双精确度(79比特以上,通常以80位实现)

IEEE 754中二进制浮点数的存储格式

IEEE 754标准中规定的二进制浮点数存储格式如图,有三个域分别对应:

  • sign:最高位是符号位,0表示正数,1表示负数(对应二进制小数的符号)
  • exponent:指数值的编码值(对应二进制小数的指数)
  • fraction:有效值的编码值(对应二进制小数的有效值,范围:大于等于1,小于2

所以,二进制浮点数的实际值为:

v a l u e = ( − 1 ) s i g n ∗ f r a c t i o n ∗ 2 e x p o n e n t value = (-1)^{sign} * fraction * 2^{exponent} value=(−1)sign∗fraction∗2exponent

举个例子就懂了:

eg.

十进制小数5.625转化为二进制为101.101B,按照IEEE 754标准表示为:1.01101*2^2,所以得出各个域的值为:

  • sign:0
  • exponent:2
  • fraction:1.01101

根据这个公式,得出了IEEE 754标准中三个域分别应该存储的数,先理解到这儿即可,后面再详细讲述如何将这三个数进行编码存储。

IEEE 754中每个域的长度

在IEEE 754标准中,不同的表示方式,对应三个区域的长度也不同。

以常用的单精度和双精度来说:

  • 32位单精度

  • 64位双精度

接下来开始最关键的部分 —— —— 有效值和指数值是以怎样的编码存储的?

IEEE 754存储格式的有效值段(fraction)

IEEE 754中规定了有效值的范围是:大于等于1,小于2

这意味着有效值的整数部分永远是1,所以这个可以忽略掉(不存储)整数部分的1和小数点,只存储小数部分的值即可。

这样做的好处是节省了一位,比如32位单精度本来只规定了23位用于存储有效数字的值,但实际可以存储24位有效数字的值。

eg.

之前的例子中有效值字段是1.01101B,省略掉整数部分的1,只存储01101B,右边不够的补零,所以单精度存储方式中,23位有效值字段的值是0110 1000 0000 0000 0000 000

IEEE 754存储格式的指数段(exponent)

指数E的存储情况比较复杂。

首先,E为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0255;如果E为11位,它的取值范围为02047。但是,科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

再用之前的例子来说明了这个知识:

eg.

指数字段是2,在32位单精度存储时,2 + 127 = 129,所以8位指数字段存储的值是129的二进制,即:1000 0001B

最后再讲述一下指数E的三种不同情况所表示的数

  • E不全为0或不全为1:浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023)就是实际值,再补上省略掉的1。

  • E全为0:浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

  • E全为1:如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。

C语言程序验证示例结果

综合上述的讲述,示例中十进制小数5.625用32位单精度存储是:

0 10000001 01101000000000000000000
= 0100 0000 1011 0100 0000 0000 0000 0000
= 0x40b40000

下面在C语言中验证一下结果是否正确:

/*** @ brief      验证浮点数在计算机中存储的IEEE 754标准* @ author     mculover666* @ date       2019年6月23日14:49:35*/
#include <stdio.h>
#include <stdlib.h>int main(void)
{float i = 5.625;    //0100 0000 1011 0100 0000 0000 0000 0000 int *p = &i;printf("i = %f\n", i);printf("i = %x\n", *p);system("pause");return 0;
}
/*** 在Mingw-w64编译器下运行结果:* ---------------------------------------i = 5.625000i = 40b40000* ---------------------------------------*/

在64位Win7系统上,用Mingw-w64编译,运行结果如下:

最后附上一个十进制小数转IEEE 754浮点数的小工具:http://www.styb.cn/cms/ieee_754.php。

【编程基础】浮点数在计算机中的存储 —— IEEE 754标准相关推荐

  1. 单精度在计算机中的存储,浮点数(单精度浮点数与双精度浮点数)在计算机中的存储...

    浮点数在计算机中的存储 十进制浮点数格式: 浮点数格式使用科学计数法表示实数.科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数 (exponent)两部分 ...

  2. 浮点数在计算机中起什么作用,浮点数在计算机中的存储表示

    今天在看面试宝典,注意到上面所说浮点数在内存里和整数的存储方式不同,但究竟有何不同呢? 在网上搜了一下: 在http://blog.csdn.net/djsl6071/archive/2007/03/ ...

  3. c语言变凉存储性,C语言数据的表示和存储(IEEE 754标准)

    C语言的数据类型大体上分为整数和浮点数两种类型.因为char和指针类型实际上都是整数类型. 移码:给每一个数值加上一个偏置常数即可.通常是加上2^(n-1)或者是2^(n-1)-1这里的n通常取编码的 ...

  4. 整数、浮点数在计算机中的存储,-128二进制怎么表示,

    目录 1 计算机底层存储数据的基本原理 2 整数的存储 2.1 整数的基本概念 2.2 整数的编码方式 -128的二进制表示 3浮点数存储 3.1 二进制十进制间小数怎么转换 1 计算机底层存储数据的 ...

  5. 数据在计算机中的存储

    1.大小端模式(字节序) 大小端的概念:数在内存中分字节存储的先后顺序.大端模式即数的低位存在高地址,高位存在低地址当中.而小端模式相反,低位存在低地址,高位存在高地址.比如0x1234,这里的高低位 ...

  6. 详解浮点数在内存中的存储

    目录 前言 一. 32 位单精度浮点数在内存中的存储 1.1 - 符号位 sign 1.2 - 偏移后的指数位 biased exponent 1.3 - 尾数位 fraction(mantissa) ...

  7. 22.25在计算机中如何储存,浮点数在计算机中存储方式

    C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= ...

  8. 计算机浮点数格式化表示方法,浮点数在计算机中是如何表示的

    原标题:浮点数在计算机中是如何表示的 来源:编程珠玑 前言 相比int等整型,float等浮点类型的表示和存储较为复杂,但它又是一个无法回避的话题,那么就有必要对浮点一探究竟了.在计算机中,一般用IE ...

  9. Java入门之7:Java中的float和double类型的浮点数是怎么按照IEEE 754标准存储的?

    前言: 这篇博文,我写了好几天--,里面涉及的基础概念比较多,内容比较多,举例也比较多,想搞清楚明白就难免 我自己都会觉得啰嗦,我整理了目录出来,看完需要一点时间,可以自行根据需要.感兴趣的 选择阅读 ...

最新文章

  1. 和远程ip_漏洞Microsoft Windows TCP/IP 远程执行代码漏洞威胁通告
  2. 【响应式Web前端设计】在html页面实时显示系统时间
  3. 看到他我一下子就悟了-- Lambda表达式
  4. 鼠标放到控件上 DIV悬浮提示效果(四种)
  5. 浏览器自动化操作标准--WebDriver
  6. React开发(206):react代码分割之context的api
  7. Gallery:收集一些用于展示一组图片的javascript控件
  8. android 模拟器方向键,键盘操控使用方法
  9. 《架构漫谈》阅读感想
  10. transactional replication 的immediate_sync属性
  11. Transformations on DStreams之updateStateByKey 的使用和状态累加
  12. PHP+MySQL实现新闻管理系统
  13. WIN10环境下VS2003的安装
  14. 魔术表演的核心秘密(六)——从障眼法到错误引导和案例分享
  15. 化模糊为清晰的图片清晰术:动手尝试修复模糊老照片
  16. python如何定义正整数_Python如何将一个正整数分解为质因数相乘
  17. 挑食有理——罗敏娜集团总裁卓顺发养生之道
  18. 头同尾合十的算法_头同尾合十的计算规律
  19. JAVA逻辑推理题1-谁是凶手
  20. Android 支持表情功能

热门文章

  1. android rc文件
  2. 【DIY】使用STM32及PID算法实现一个磁悬浮玩具
  3. html flash 兼容浏览器
  4. Android常见知识点
  5. 解决eclipse开发Android时无法真机调试(使用魅族魅蓝note2实验)
  6. 使用OpenCV,Haar级联检测器进行面部、眼睛、嘴部检测
  7. 城墙(sandcas.pas/cpp)
  8. PBX与IPPBX孰好
  9. 集成电路设计-电路网表写法
  10. python 仪表盘实现_使用python绘制一个仪表盘显示