C/C++的浮点数在内存中的存储方式分析及实例

2020-01-06 15:51:01于丽

同理若将float型数据0.5转换为二进制形式

0.5的二进制形式为0.1,由于规定正数部分必须为1,将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为

0 01111110 00000000000000000000000

由上分析可知float型数据最大表示范围为1.11111111111111111111111*2^127=3.4*10^38

对于double型数据情况类似,只不过其阶码为11位,偏置量为1023,尾数为52位。

 测试程序:



/*测试浮点型数据在内存中存放方式 2011.10.2*/ 

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
  float a=125.5;
  char *p=(char *)&a;
  printf("%dn",*p);
  printf("%dn",*(p+1));
  printf("%dn",*(p+2));
  printf("%dn",*(p+3));
  return 0;
}

输出结果为:

0

0

-5

66

在上面已经知道float型125.5在内存中存放方式为:

00000000   低地址

00000000

11111011

01000010   高地址

因此对于p和p+1指向的单元,其中存储的二进制数表示的十进制整数为0;

而对于p+2指向的单元,由于为char型指针,为带符号的数据类型,因此11111011,符号位为1,则为负数,由于在内存中二进制是以补码存储的,所以其真值为-5.

对于p+3指向的单元,01000010,为正数,则其大小为66。上面程序输出结果验证了其正确性。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


注:相关教程知识阅读请移步到C++教程频道。