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

在计算机内存中,float型数据占4个字节,double型占8个字节,它们在计算机中的存储分为三个部分:

  1. 符号位:0代表正,1代表负。
  2. 指数位:将一个二进制数用科学计数法表示之后指数的值。
  3. 尾数位:用科学计数法表示的前面的数。

其中存储的方式如图

double型的数据存储方式与之类似,只不过能表示更大的数位

现在就用float型的数据来举例吧。

比如,12.5f为一个float型的浮点数,先把它转化为二进制数为1100.1,用科学计数法表示为1.1001*2^3。现在就可以表示把这个二进制数分为三部分

符号位,这个数为正数,所以符号位为0。

尾数位为1.1001,由于尾数的整数部分肯定为1,所以可以省略,在尾数部分只存储小数点后的数,即可以用23bit来表示24bit的精度,4个bit可以精确到小数点后一位,所以24bit就可以表示小数点后6位的数字啦。

指数位有点特别,需要先加上127(称为偏移量),然后再存到内存中。为什么需要加上这个偏移量呢,维基百科给出了关键的原因,“采用指数的实际值加上固定的偏移值的办法表示浮点数的指数,好处是可以用长度为e个比特的无符号整数来表示所有的指数取值,这使得两个浮点数的指数大小的比较更为容易。”这样做的目的就是为了之后的计算更加容易。所以在这个例子里面,指数位存的就是(127+3)的二进制数,即10000010。

所以现在就能将12.5f这个浮点数存到计算机中啦(不考虑反码和补码),表示出来为:0 10000010 10010000000000000000000

对于一些小数部分无法准确表示的数来说,比如3.3,这个数字的小数部分没办法表示为准确的二进制数,为11.010011001100110011......无限循环下去,这个时候,由于尾数部分只能存储23bit的数据,所以这个时候就会把多余的尾数舍弃掉(损失精度),然后存够23bit的数据。

对于浮点数的读取,只要按上面的步骤反着来一遍就好了:先取出尾数部分的数据,然后给整数部分补上1;接着取出指数位的数据,大于127小数点右移,移动位数为n-127;

最后从符号位取出数据判断符号,然后你就可以得到一个完整的数据了。当然这个数据是二级制格式的,如果想让大部分人都能看懂,还需要把它转换为十进制格式啦。

时间: 2024-11-03 21:52:09

浮点数在计算机内存中的存储方式的相关文章

移码及浮点数在内存中的存储方式

首先说一下十进制的小数怎么转化为二进制的小数,计算机根本就不认识10进制的数据,他只认识0和1,所以,10进制的小数在计算机中是用二进制的小数表示的. 十进制的小数转化为二进制的小数的方法: 可以简单的概括为正序取整,将十进制的小数部分乘以2,然后取整数部分. 例如将0.2转化为二进制的小数,那么0.2*2=0.4,其整数部分是0,所以二进制小数的第一位为0,然后0.4*2=0.8,其整数部分是0,所以二进制小数的第二位为0,然后0.8*2=1.6,其整数部分是1,所以二进制小数的第三位是1,然

C语言中浮点数在内存中的存储方式

关于多字节数据类型在内存中的存储问题 //////////////////////////////////////////////////////////////// int ,short 各自是4.2字节.他们在内存中的存储方式以下举个样例说明. int data = 0xf4f3f2f1; 当中低位存放在编址小的内存单元.高位存放在编址高的内存单元 例如以下: 地址:0x8000      0x8001    0x8002   0x8003 数据:   f1              f2 

float、double的精度、范围,在内存中的存储方式

float.double的精度,在内存中的存储方式 ? 一.浮点型变量在内存中的存储方式 Java的浮点数遵循IEEE 754标准,采用二进制数据的科学计数法来表示浮点数,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53.该标准中表示的浮点数表示分为规约形式和非规约形式以及特殊情况. ??? 无论是单精度还是双精度在存储中都分为三个部分: 符号位(Sign) : 0代表正,1代表为负 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储 尾

QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度复制)非常实用

FROM:http://apps.hi.baidu.com/share/detail/33517814 今天做项目时,需要用到QList来存储一组点.为此,我对QList类的说明进行了如下翻译. QList是一种表示链表的模板类.QList<T>是Qt的一种泛型容器类.它以链表方式存储一组值,并能对这组数据进行快速索引,还提供了快速插入和删除等操作.QList.QLinkedList和QVector提供的操作极其相似:* 对大多数操作来说,我们用QList就可以了.其API是基于索引(inde

变量在内存中的存储方式-----“大端”和“小端”

"大端"和"小端"可以追溯到1726年的Jonathan Swift的<格列佛游记>,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争.1981年10月,Danny Cohen的文章<论圣战以及对和平的祈祷>(On holy wars and a plea for peace)将这一对词语引入了计算机界(<程序设计实践>第9章).这么看来,所谓大端和小端,也就是big-endia

结构体在内存中的存储方式

结构体在内存中如何存储? 遵循结构体对齐规则: 1.首先要知道默认对齐数:VS 中 8   Linux 中4 2.第一个成员放到0偏移处 3.后面所有的成员都放到对齐数(本身和默认对齐数的较小值)的倍数处偏移 4.结构体总大小为所有对齐数中最大对齐数的倍数 Eg: 运行结果为 24 图中可以看出内存有浪费,而我们将小的成员放一起可以节省资源 减少浪费. 上例可以改为: int i: char c: double d: 这样总大小只需16 节省浪费. 空的结构体类型大小为1,创建对象需要开辟空间,

C/C++浮点数在内存中的存储方式

任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中,存放方式为  10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式.但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法. 在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M).对于fl

深度剖析数据在内存中的存储2——浮点数数在内存中的存储

根据国际标准IEEE:任意一个二进制浮点数V可以表示为下面形式:(-1)^SM2^E:(-1)^S表示符号位,当S为0,V为正数:当S为1,V为负数.由其物理结构决定了,浮点数为有符号数.M为有效数字,大于等于1,小于2.2^E表示指数位.eg:5=>0101=>(-1)^01.012^2. S=0,M=1.01,E=2规定:对于32位的浮点数(单精度浮点数存储),最高1位是符号位(S),接着的8位为指数位(E),剩下的23位是有效数字位(M),不满23位后面补0.对于64位的浮点数(双精度浮

堆栈详解(数据与内存中的存储方式)

转自:http://www.360doc.com/content/11/0428/18/6580811_112988089.shtml char* r = "hello word!"; char b[]="hello word!"*r = 'w'; *b='w'; 其实应该是语法错误,可是VC++6.0没有警告或者错误,r指向的是文字常量区,此区域是编译的时候确定的,并且程序结束的时候自动释放的, *r = 'w';企图修改文字常量区引起错误,b的区别在于其空间是在