目录

【飞郁2022新课程】13 - 浮点数内存中的储存方式

目录

一个小数,无论是单精度的float型还是双精度的double型,在内存中都会储存为三个部分,即符号位,指数位,尾数

符号位就是小数的正负,0代表正数,1代表负数

那指数位是什么呢?

其实小数在内存中都是以科学计数法去存放的,而指数位则用来存放科学计数法的指数数据,一会我们再细说

尾数用来存放科学计数法后的尾数,也就是小数部分

听起来是不是有些懵?不要紧,咱们举一个例子就明白了

比如我们有一个float型的8.25,要计算出他在内存中是如何存放的

首先将其转化为二进制

整数部分的转化我们之前已经讲过了,主要采用的是除法

而小数部分则需要用乘法,

0.25*2=0.5 记0

0.5*2=1.0 记1

于是小数部分为0.01

所以8.25=(1000.01)2

大家可以思考下,如果是8.3转成二进制会是什么样子呢?

下面将1000.01转成科学计数法,得到1.00001*103

首先是符号位,float型小数的符号位存放在0-31位的最高位也就31位,由于是正数,所以计0

然后是指数位,float型小数指数位为23-30位,起始值是127,也就是(0111 1111)2,代表0次幂

1次幂则用1000 0000表示

那么3次幂表示为1000 0010

最后是尾数,也就是剩下的0-22位,用来表示小数位,即00001000000000000000000

然后我们将这三部分拼起来,即01000001000001000000000000000000

转成16进制为0x41040000

以上是float型数据在内存中的存放方式,double型的存放方式是与其类似的

不同的是double型的指数起始值是1023,占用52-62这11位,而尾数则占用0-51这52位,算上符号位一共是64位

大家可以尝试着写一个double型的数据来算一算哦。

这里面我们说的第几位 实际都是我们转换成4字节以后的位数 不是内存中真实的位置 只要简单了解规则即可

为什么所有的小数转换成DWORD型都长的很像呢?这就要从指数位说起了。

我们以float型为例,如果指数是负数或者0,那么他的指数位通常表现为011xxxxx,

如果是正数指数位则表现为100xxxxx

如果算上前面的符号位,那么前面4位可能为0011,0100,1011,1100,转化成16进制则为3,4,B,C

所以说小数转换为DWORD型之后都长的很像

算一算以下float型数据在内存中是如何储存的,写出计算过程,并转化为DWORD型

6.125 15.5 2

0.25 0.3 10.005

算算以下double数据在内存中是如何储存的,写出计算过程,并转化为QWORD型

5.0625 1