float类型存储的浮点表示法

前几天看了网上的一个博客,突然发现自身对于计算机数据类型理解的匮乏,在朋友和同学还有多种搜索的帮助下,终于大体理解了float类型在内存中的存储。以下为相关理解:

首先明确一下float 类型存储为四字节的单精度浮点数。 它表示单精度 32 位 IEEE 754 值。

附带一句:int与 short int是不同的两个概念,网上有人误解为int是short int的缩写是无稽之谈。  short int 是固定的16位,而int型根据16位机型(早期的)、32位机型、64位机型不同会有所不同。


维基百科上有IEEE745的详尽解释 http://zh.wikipedia.org/wiki/IEEE_754

先从概念上理解,这32bit每位表示的含义:

0-22位 这23个二进制数表示尾数

23-30位 这8个二进制数表示指数(注意:是二进制的指数,不是十进制的,因为这里我们算错了很多)

31位 表示符号位


另附一段,因为系统的不同在内存中的排布可能与你所想的不同:分为大端模式和小端模式(这个如果你感兴趣可以百度一下)

VS中可以通过指针指向地址查看内存地址里的数据,具体操作:

在“调试”菜单上单击“窗口”,再单击“内存”,然后单击“内存 1”、“内存 2”、“内存 3”或“内存 4”。

其中,只有在“选项”对话框中的“调试”节点下启用了地址级调试后,“内存”窗口才可用。

可以使用“内存”窗口查看无法在“监视”或“局部变量”窗口中正常显示的大缓冲区、字符串和其他数据。在 Visual Studio 调试器中,最多可以打开四个“内存”窗口。


写这篇博客的原因是因为CSDN网上看到了一个讨论其网址如下:

http://bbs.csdn.net/topics/390509086?page=1#post-394968076


主要针对在内存中的   0x41 0x00 0x00 0x00 怎么会按float解释为+0.9108440018111311E-43的情况感到不解,因为刚开始看到float浮点表示法算出来怎么也不可能把指数为算成-43,后来发现这里面有几点需要注意:

1.算八位指数(那里叫阶数时)需要先减去127,这个是IEEE内部定义的,目的估计是可以减少重0(+0与-0)的表示。但要注意得出来这个值肯定不会是-43,因为你得出的值是二进制的阶数,并不是十进制的指数,所以这里会有问题,我们算错的地方也是这里。

2.另外float处理时会有整数位-1运算,得出结果后再进行加1运算,这个可以参考如下网址

 http://www.cnblogs.com/killmyday/archive/2009/03/22/1419079.html可以从网址中理解内存分布和加1减1

最后,朋友们用matlab也运算了指数为算的与VS表示相同,只是matlab运算尾数0.9108略有差异,应该是两种软件算法不同导致的。


以下是VS的结果测试:输入65  调试看65的float表示值


同样可以查看sp的地址:这里内存中由低到高存储int类型,但float类型你自己运算的时候可是相反的处理0x00 0x00 0x00 0x41



这里可以体现《POINTERS ON C》中的经典定义:值的类型并不是值的内在本质,而是取决于它被使用的方式

由于能力有限,本人只能写到这种程度,如果众网友发现不对的地方还望指正。谢谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值