在C/C++中float是32位的,double是64位的,二者在内存中的存储方式和可以表示的精度均不一样,目前C/C++编译器标准都遵守IEEE制定的浮点数表示法来进行float,double运算。html
不管是float仍是double,在内存中的存储主要分红三部分,分别是:.net
(1)符号位(Sign):0表明正数,1表明负数htm
(2)指数位(Exponent):用于存储科学计数法中的指数部分,而且采用移位存储方式blog
(3)尾数位(Mantissa):用于存储尾数部分内存
对于二者在内存中的存储结构,以下图所示:get
数字float 9.125在十进制中用科学计算的方式表示为9.125*10^0 ,可是在计算机中,计算机只认识0和1,因此在计算机中是按照科学计算的二进制的方式表示的:编译器
9的二进制表示为1001it
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是相似的,只是存储的位数不一样,在原理上都是同样的。
http://blog.csdn.net/qingtingchen1987/article/details/7719259