剖析浮点数在内存中的存储
来源:互联网 发布:软件外包公司介绍ppt 编辑:程序博客网 时间:2024/06/05 21:34
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
无论是单精度还是双精度在存储中都分为三个部分:
- 符号位(Sign) : 0代表正,1代表为负
- 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
- 尾数部分(Mantissa):尾数部分
其中float的存储方式如下图所示:
而双精度的存储方式为:
了解了浮点数的存储,我们来看个例子:
#include <stdio.h>int main(int argc, char *argv[]){float i = 3;int j = *(int *)(&i);printf("i = %f\n", i);printf("j = %#x\n", j);return 0;}
i是毋庸置疑是:3.000000。但是j呢?3.000000?答案是否定的,j是输出:0x4040 0000。有人会问了,难道j是随机输出?瞎说,j输出0x4040 0000是有依据,是一个定值!
由于i是float数据类型,而j是int数据类型。理论上说,j是取了i的地址然后再去地址,应该得到的就是i的值:3。但是问题的关键就是float数据类型的存储方式和int数据类型不一样,float是占用4个字节(32位),但是float存储是使用科学计数法存储,最高位是存储数符(负数的数符是0,正数的数符是1);接下来8位是存储阶码;剩下的23位是存储尾数。上面i=3.000000,那么3.000000(10进制) = 11(2进制) 。数据在电脑中存储都是二进制,这个应该都没有疑问。那么这里的数符为:0 ,阶码为:E – 127 = 1 ,那么阶码为:E = 128 即为:1000 0000 (2进制) ,尾数为:100 0000 0000 0000 0000 0000 。那么存储形式就是:0100 0000 0100 0000 0000 0000 0000 0000。这个数据转换成16进制就是0x4040 0000。
几种数据类型的存储方式 1 0
- 剖析浮点数在内存中的存储
- 剖析整数,浮点数在内存中的存储
- 剖析整数,浮点数在内存中的存储
- 剖析整数,浮点数在内存中的存储
- 剖析整数、浮点数在内存中的存储
- 剖析整数,浮点数在内存中的存储
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储形式
- 浮点数在内存中的存储格式
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储格式
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储格式
- 浮点数在内存中的存储
- 浮点数在内存中的存储方式
- 浮点数在内存中的存储
- 浮点数在内存中的存储格式
- POJ百炼-2806-公共子序列
- UNIX SOCKET编程简介
- 图像去雾-dehaze-defog
- 字符串加密
- Redis缓存Mysql技术实现
- 剖析浮点数在内存中的存储
- xmpp smack 资源汇总
- 找不到R文件及颜色用法不规范导致的错误
- 【历届试题】幸运数
- 配置github环境使用brackets开发网页
- 算导--最大子数组问题
- HBase架构图及数据模型
- Linux内核分析:实验二
- c语言之sizeof运算符