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更高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明故宫的记忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值