C/C++中float和double的存储结构
2016-04-04 21:39
363 查看
转载自:http://blog.csdn.net/qingtingchen1987/article/details/7719259
在C/C++中float是32位的,double是64位的,两者在内存中的存储方式和能够表示的精度均不同,目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。
无论是float还是double,在内存中的存储主要分成三部分,分别是:
(1)符号位(Sign):0代表正数,1代表负数
(2)指数位(Exponent):用于存储科学计数法中的指数部分,并且采用移位存储方式
(3)尾数位(Mantissa):用于存储尾数部分
对于两者在内存中的存储结构,如下图所示:
数字float 9.125在十进制中用科学计算的方式表示为9.125*10^0 ,但是在计算机中,计算机只认识0和1,所以在计算机中是按照科学计算的二进制的方式表示的:
9的二进制表示为1001
0.125的二进制表示为0.001
所以9.125的表示成1001.001 将其表示成二进制的科学计数方式为 1.001001*2^3
在计算机中,任何一个数都可以表示成1.xxxxxx*2^n 这样的形式,
其中xxxxx就表示尾数部分,n表示指数部分
其中,因为最高位橙色的1这里,由于任何的一个数表示成这种形式时这里都是1,所以在存储时实际上并不保存这一位,这使得float的23bit的尾数可以表示24bit的精度,double中52bit的尾数可以表达53bit的精度。
对于float型数据,可以精确到小数点后几位呢?当然,学过c的同学会说float能够精确到小数点后6位,但这是怎么的来的呢?下面做一点解释:
十进制中的9,在二进制中的表示形式是1001,这里也就告诉我们,表示十进制中的一位数在二进制中需要4bit,所以我们现在float中具有24bit的精度,所以float在十进制中具有24/4=6,所以在十进制里,float能够精确到小数点后6位。同理,具有53bit精度的double类型能够精确到小数点后13位。
对于float类型,他的指数部分有8bit,可以表示-127~128,但是这里采用了移位存储的方式,在存储指数时数据的基数是127,而不是0,。例如上面的9.125,其二进制的指数部分为3,所以在存储时实际上存的是127+3=130。(130的二进制表示为10000010)
最终根据上面图中float的存储结构可以知道,实际上9.125在计算机中:
上面的二进制数转换成十六进制后表示形式为:01000001 00010000 00000000 00000000 --> 41 10 00 00
实际上在X86计算机中,采用的是小端存储方式,即低地址存储低位数据,高地址存储高位数据。
所以数据应该是这样存储的:
对于double类型的存储方式实际上和float是类似的,只是存储的位数不同,在原理上都是一样的。
在C/C++中float是32位的,double是64位的,两者在内存中的存储方式和能够表示的精度均不同,目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。
无论是float还是double,在内存中的存储主要分成三部分,分别是:
(1)符号位(Sign):0代表正数,1代表负数
(2)指数位(Exponent):用于存储科学计数法中的指数部分,并且采用移位存储方式
(3)尾数位(Mantissa):用于存储尾数部分
对于两者在内存中的存储结构,如下图所示:
数字float 9.125在十进制中用科学计算的方式表示为9.125*10^0 ,但是在计算机中,计算机只认识0和1,所以在计算机中是按照科学计算的二进制的方式表示的:
9的二进制表示为1001
0.125的二进制表示为0.001
所以9.125的表示成1001.001 将其表示成二进制的科学计数方式为 1.001001*2^3
在计算机中,任何一个数都可以表示成1.xxxxxx*2^n 这样的形式,
其中xxxxx就表示尾数部分,n表示指数部分
其中,因为最高位橙色的1这里,由于任何的一个数表示成这种形式时这里都是1,所以在存储时实际上并不保存这一位,这使得float的23bit的尾数可以表示24bit的精度,double中52bit的尾数可以表达53bit的精度。
对于float型数据,可以精确到小数点后几位呢?当然,学过c的同学会说float能够精确到小数点后6位,但这是怎么的来的呢?下面做一点解释:
十进制中的9,在二进制中的表示形式是1001,这里也就告诉我们,表示十进制中的一位数在二进制中需要4bit,所以我们现在float中具有24bit的精度,所以float在十进制中具有24/4=6,所以在十进制里,float能够精确到小数点后6位。同理,具有53bit精度的double类型能够精确到小数点后13位。
对于float类型,他的指数部分有8bit,可以表示-127~128,但是这里采用了移位存储的方式,在存储指数时数据的基数是127,而不是0,。例如上面的9.125,其二进制的指数部分为3,所以在存储时实际上存的是127+3=130。(130的二进制表示为10000010)
最终根据上面图中float的存储结构可以知道,实际上9.125在计算机中:
上面的二进制数转换成十六进制后表示形式为:01000001 00010000 00000000 00000000 --> 41 10 00 00
实际上在X86计算机中,采用的是小端存储方式,即低地址存储低位数据,高地址存储高位数据。
所以数据应该是这样存储的:
对于double类型的存储方式实际上和float是类似的,只是存储的位数不同,在原理上都是一样的。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Linux C函数参考手册(PDF版)
- C# partial关键字说明
- Lua中调用C++函数示例
- Lua教程(十七):C API简介
- 简单谈谈lua和c的交互
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#中的委托数据类型简介
- C++联合体转换成C#结构的实现方法
- C#编写的艺术字类实例代码
- C#实现打造气泡屏幕保护效果
- 举例讲解C#编程中委托的实例化使用
- 使用C#代码获取存储过程返回值
- C++高级程序员成长之路
- C++编写简单的打靶游戏