浮点型数据在内存中的存储还不清楚?看过来包教你会!

一天两更,肝!今晚给大家分享浮点型数据在内存中的存储方式,首先我们大家学过浮点型就知道浮点型分为单精度浮点数(float)和双精度浮点数(double)。那么它们在内存中的存储方式是怎样的呢,容我慢慢道来。

浮点数在内存中的存储方式与字符型和整形不相同,国际电子电器工程师协会为浮点数的二进制行形式制定了一个规则:V = (-1)^S * M * 2^E,该式子可以将所有的浮点数二进制形式表示出来。由于在计算机内存中数据的存储都是以二进制存储的。看到这我们知道存一个浮点数,现将其转化为二进制形式然后按照这个式子来存储即可。这里的S代表存储的浮点数是正数还是负数,当S为0即(-1)^0 = 1 代表该浮点数V为正数,当S为1即(-1)^1 = -1 代表该浮点数V为负数。M代表存储数的有效数值(1 < M < 2,M的形式以 1. 开头),E则是代表指数位(我对其值的理解是大小为M移动了多少位)。其实我们存储浮点数就是存储S、M、E这三部分的值,现在咱举个栗子存一个float类型的值5.5,对于单精度的浮点数我们一般都是用32个比特位来存储(原因是float类型占4个字节),其中符号位S与char类型的存储方式一致都是用1个比特位来存储就行了,E部分利用8个比特位存储(8个比特位最大值为127)剩余比特位用来存储M这里需要注意的是E可能取负值例如(0.001234)S = 0 ,E = -3, M = 1.234,(14.26)S = 0 ,E = 1, M = 1.426,所以我们存储E的这部分的时候需要加上一个附加值(对于float来说是127,对double来说是1023),保证我们E不分始终为正数目的是方便我们人记忆。(这里使用127的原因就是咱E部分存储的最小值为-127那么加上附加值的话也就是0了,这很方便我们记忆),M部分我说过以 1. 开头的形式存储,但是童鞋们仔细想想,若是每个浮点数的M部分都是1.开头的那么这1是确定值对吧,是确定值我们在存储的过程中能不能把他省略掉不存储进内存中,这样一来还可以为我们多存一位的精确度,而且我们只需要在读取之前把这个1加上去就可以了。

5.5的二进制形式为:101.1 其存储形式为(0 10000001 01100000 00000000 0000000)上述所讲为float类型浮点数是怎样存放到内存中去的,同理double类型也和这样一样,区别在于double类型自身占用8个字节也就是64个比特位,其存储也是存S E M三部分,S用1个比特位,E用11个比特位,余下的位用来存M部分。

好,现在我们来说浮点数在内存中又该怎样把他给取出来呢?我想童鞋们有了上述公式的支撑再加上我们存了什么进去,你们应该知道咱们该取什么出来了吧。没错就是将咱们的S,E,M三部分分别取出并计算正确结果,然后利用公式就可得到原本的结果。(这里需要说明,我们一般取的浮点数的M部分都是0和1组成的,不可能为全0(这样浮点数无线接近于0了,童鞋若不信可自行去检验),也不可能全为1(这样的浮点数接近于无穷大了,也可去检验))

最后我得说一下,我们有些浮点数在内存中是不能完全按照其十进制精确地存储的,多多少少会有差距。3.14,15.99这些他们的小数点后面的数值在转换为二进制时,不能完全的精确到位,而是不断接近这个值。所以浮点数的存储的精度不一定能精确到位,童鞋们记好这一点哟

代码例子如下,童鞋们可参考一下:

int main()
{
	float num1 = 3.14143f;
	float num2 = 15.9f;
	float num3 = 99.7f;
	printf("%f\n", num1);
	printf("%f\n", num2);
	printf("%f\n", num3);


	return 0;
}

好了,也不早了今天就分享这些,以上皆为我个人的观点,若有错还请各位童鞋指出,本意还是希望于你有益。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值