C语言-double和float在内存中的存储方式

本文主要介绍double和float数据类型在C语言中的存储方式

double和float存储方式介绍

从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。

任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。

比如一个16位(2 字节)的short int型变量的值是1000,那么它的二进制表达就是:00000011 11101000。

由于Intel CPU的架构原因,它是按字节倒序存储的,那么就因该是这样:11101000 00000011,这就是定点数1000在内存中的结构。

下面是具体的规格:
float在内存中的存储方式:
float在内存中占4个字节(32bit),32bit=符号位(1bit)+指数位(8bit)+底数位(23bit)

在这里插入图片描述

double在内存中的存储方式:

类型 符号位 阶码 尾数 长度
float 1 8 23 32
double 1 11 52 64

如何存储?

目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。

这种结构是一种科学计数法,用符号、指数和 尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。

无论是单精度还是双精度在存储中都分为三个部分:

  1. 符号位(Sign) :0代表正,1代表为负
  2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储。可能叫阶码更准确一些,计算机原理学完就忘了。127和1023是为了考虑指数位的正负。
  3. 尾数部分(Mantissa):尾数部分

首先来看float类型(以2.25为例)

  • 步骤一:符号位(占1个bit位)的数值

很容易看出此数为正数,因此符号位为0。

  • 步骤二:指数位(占8个bit位)的数值

    • 第一步:先将十进制的2.25转换成二进制0010.01;

    • 第二步:将10.01用二进制的科学计数法表示为1.001;

    • 第三步:将第二步所得数值写成指数形式1.001*(2^1);

    • 第四步:将指数数值1+127=128,将128转化成二进制形式(1000 0000)写到指数部位。

  • 步骤三:尾数部分(占23个bit位)的数值

  • 将步骤二第二步中所得的数1.001,小数点后的三位数001写到指数部位,剩下的位用0补齐即可。

所以单精度浮点数2.25在内存中的表示方式为:

0 1000 0000 00100000000000000000000


再来看double类型(还是以2.25为例)

  • 步骤一:符号位(占1个bit位)的数值

很容易看出此数为正数,因此符号位为0。

  • 步骤二:指数位(占11个bit位)的数值

    • 第一步:先将十进制的2.25转换成二进制0010.01;

    • 第二步:将10.01用二进制的科学计数法表示为1.001;

    • 第三步:将第二步所得数值写成指数形式1.001*(2^);

    • 第四步:将指数数值1+1023=1024,将124转化成二进制形式(100 0000 0000)写到指数部位。

  • 步骤三:尾数部分(占52个bit位)的数值

  • 将步骤二第二步中所得的数1.001,小数点后的三位数001写到指数部位,剩下的位用0补齐即可。

所以双精度浮点数2.25在内存中的表示方式为:
0 100 0000 0000 0010000000000000000000000000000000000000000000000000

猜你喜欢

转载自blog.csdn.net/baidu_33256174/article/details/130716263