C/C++数据存储之float和double在内存中的存储方式

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更高。

Guess you like

Origin blog.csdn.net/weixin_42314225/article/details/99710782