文章目录

  • 前言
  • 一、浮点型数据都有哪些?
  • 二、存储形式
  • 1.float类型存储形式
  • 2、若为double类型
  • 3、读出数据
  • 三、举个读出的例子
  • 结论



前言

整型存储大家都很容易理解,计算机中存放的是整型的反码,那大家有没有想过这样一个问题,浮点型数据在计算机中如何存储的呢,今天在网上搜了一下,发现浮点型数据的存储要比整型数据存储复杂的多。


一、浮点型数据都有哪些?

众所周知,浮点型家族有单精度浮点型float类型和双精度浮点型double类型,float类型占4个字节,而double类型占8个字节,那他们的存储形式是什么样的呢?

二、存储形式

1.float类型存储形式

IEEE754规定:float类型浮点数32位以S M E形式存储,即S占1bit,M占8bit,S占23bit,这样加一起正好是32个bit位
32位浮点数float:S(1bit)E(8bit) M(23bit),其中他们S M E分贝是什么意思呢?
首先,当我们有一个float类型的数据时,我们想要放进内存中,第一步先把数据变成科学计数法的形式,比如:0.5(十进制)=0.1(二进制)=1.0×2^-1(科学计数法)
于是,一个float类型的数据可以这么表示:(-1)^S×M×(2的E次幂)
S表示正负数,S=0表示正数,S=1表示负数,占第一位
M在于1和2之间,但是在存储时,由于都是1.xxxxxxx这种形式,M直接丢弃小数点前面的1,直接保存小数点后面位数,占8位。
E为无符号数 ,故当出现2^(-x)这种情况时,无法存储,所以规定E最终存储的数要加上127,比如上述0.5的例子,其实在实际存储时加的是-1+127=126,即E这8bit实际存储的是126,即0111 1110。

1. 举个存储的例子

f=5.5f 转换一下二进制101.1,转换为科学计数法1.011×2^3,于是
S=0 M=011 E=2+127=1000 0001
M位数不够补上0=011 0000 0000 0000 0000,最终结果
0100 0000 1011 0000 0000 0000 0000 0000=0x40 b0 00 00

2、若为double类型

S仍然表示正负数,而此时E分配了11个bit空间,其余52bit空间给了M。比如:0.5(十进制)=0.1(二进制)=2^-1,此时,E中存放的是-1+1023=1022(而不是之间+127)最终加1023之后,存放在E的11个bit位中,其他与float类型相似。
PS:为什么规定float类型数据存储时加127,double存储时加1023,大家可以仔细观察一下最终两种浮点型数据给E分配了多少空间,比如:float类型数据给E了8bit空间,而又要求E中存放的为正数,2^8=256,最大可以表示为0-255之间的数,显然,如果存在负数,最好的方式就是中间+127,使得范围变为-127到128,调节一下E的范围,float类型数据亦是如此。(个人理解)

3、读出数据

数据读出时分为3种情况,
1、E不全为0或不全为1:怎么拿出去的怎么拿回来;
2、E全为0:-127+127直接规定为,E=1-127(1-1023)(为什么有个1,因为后面把1.xxxx改成了0.xxxx,每个规定都是有依据的),有效数字M不再加1而是还原为0.xxxxxx小数,这样做表示±0,以及接近于0的很小的数字;此时数据很小。
3、E全为1:表示±无穷大。


三、举个读出的例子

int main()
{
  int n = 9;
  float* pFloat = (float*)&n;
  printf("%d\n",n);
  printf("%f\n",*pFloat);
 *pFloat = 9.0;
  printf("%d\n",n);
  printf("%f\n",*pFloat);
}

首先分析,n为9,毫无疑问,第一个打印的肯定是9,而第二个确实以浮点型打印,故9在内存中存储为0000 0000 0000 0000 0000 0000 0000 1001,则s=0 E=0000 0000 M=000 0000 0000 0000 0000 1001,显然E全为0,那就直接0. 000 0000 0000 0000 0000 1001×2^-126=0.000000
第三个为9.0=1001.0=1.001×2^3,于是s=0,E=3+127=130,M=001 0000 0000 0000 0000 0000,
于是,SEM连起来,0 1000 0010 001 0000 0000 0000 0000 0000翻译成整型为1,091,567,616,最后一个就是不用多说了,就是浮点型。