【飞郁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