float和double在内存中的存储方式
说来惭愧,工作那么多年,对于float和double浮点数在内存中的存储方式一直迷迷糊糊,今日闲暇,干脆一口气将之前模糊不清的地方
一次性扫荡掉
float数据类型在内存中的存储
无论是单精度还是双精度,在内存存储中都分为3个部分:
1 符号位(Sign):0代表正,1代表为负;
2 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储;
3 尾数部分(Mantissa):尾数部分
以下为float型数据在内存中的存储方式
打开VS2017,写个程序打断点分析一下
#include "pch.h"
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
float t = 19.133;
uint32_t* p = (uint32_t*)&t;
uint32_t r = *p;
}
通过r值可知,数据在内存中存放的值为十六进制数0x41991062,展开32位float二进制分析:
0 10000011 00110010001000001100010
符号位:0 为正
指数位:10000011 十进制为131,根据IEEE规定,减去127方为真正的指数,故指数为4
底数位:001 1001 0001 0000 0110 0010
底数为:1.0011001000100000110001
该浮点数表示为 1.0011001000100000110001*10000
即
10011.001000100000110001
19+1/23+1/27+1/213+1/214+1/2^18 = 19.132999420166
double数据类型在内存中的存储
我们依然使用19.133为例来研究double中对该数据的存储方式,并类比float,从而明白为什么double比float型精度更高
十六进制:0x4033220C49BA5E35
二进制:0100000000110011001000100000110001001001101110100101111000110101
符号位:0
指数位:10000000011
底数位: 0011001000100000110001001001101110100101111000110101
底数为:1.0011001000100000110001001001101110100101111000110101
该浮点数表示为 1.0011001000100000110001001001101110100101111000110101*10000
即
10011.001000100000110001001001101110100101111000110101
19+1/23+1/27+1/213+1/214+1/2^18 + …
总结
同样对float和double类型的数据赋值,从存储上可以看出double的精度比float更高。