ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

关于数据在内存中的存储下

2021-11-29 14:05:03  阅读:208  来源: 互联网

标签:存储 浮点数 内存 127 pFloat 9.0 关于


关于数据在内存中的存储下

本文将讲解浮点数在内存中存储的相关知识

首先,先来看一下以下这个程序:>

在学习的时候, 我给出的答案是非常的单纯的9 9.0 9 9.0,然而,当程序跑起来之后:>

在这里插入图片描述

要分析以上程序, 首先得了解浮点数在内存中的存储。

对于二进制浮点数, 根据国际标准IEEE(电气和电子工程协会) 754, 任意一个二进制浮点数V都能表示为以下形式:>

*(-1) ^S * M 2 ^E

其中(-1)^S为符号位,当s = 0 时,V为正数, 当浮点数s = 1 , V为负数.

M为有效位, M>=1且M < 2

2 ^E次方表示指数位

举个例子:>

例如十进制浮点数 5.5,我们将其转换为二进制就为:>

101.1 //这里是 .1的原因是此处1的权重是2 ^-1次方,即为0.5.而我们用上面V的格式,就能这样写:>

*(-1)^0 1.011 * 2 ^ 2

即S = 0; M = 1.011; E = 2;

对于-5.5,用上面V的格式, 就可以表示为

*(-1)^1 (1.011) * 2 ^2;

对于浮点数在内存中的存储,有以下规定

对于单精度浮点数而言

在这里插入图片描述

对于双精度浮点数:>

在这里插入图片描述

此外还有一些规定: 因为M总是>=1 小于2, 即M永远是等于1的整数, 因此,在内存中存放时,只会存小数位,例 5.5

可以表示为**(-1)^0 1.011 * 2 ^ 2*, M = 1.011。 但我们存储的收, 只会存储011, 而当我们去使用的时候, 才会把1给补上。

对于指数E而言, 其首先是一个unsigned int类型的数, 因此它的范围为 0 ~ 255(8bit) 或者 0 ~2047(11bit)

而用科学计数法表示的时候, 难免会出现E为负数的情况 例如 十进制0.5 用二进制数表示为:>

1*10 ^-1 又E的范围大于等于0, 因此, 规定存入内存E的真实值必须再加上一个中间数, 即加127 (8bit) 或1023(11bit)后,再存入内存

例如刚才的-1.,保存成32位浮点数时, 保存为 -1 + 127 = 126即

01111110

此外, 指数E还有以下规定:>

若E的值不全为1或0, 则E的真实值就为内存中存储的值减去127(或1023),再将有效数字M前加上第一位的一。

例如刚才的0.5 二进制V表示为:>

1.0*2 ^ -1 此处E为-1, M为1.0,因此存进内存中的数据为

0 01111110 00000000000000000000000

若E中存储的数据为全0时, 那么我们想一下, 则将是一个多么小的数字!,即2^ -127次方, 因此, 规定如下:>

当E中存储的数据为全0时, 其指数E的真实值为 1 - 127(或1023), 且有效数字M前不再加上一, 而是加上0, 以此来表示一个接近0的数。

当E中存储的数据为全一时, 那么E的真实值为128(8bit), 那么2^E次方是一个非常大的数字, 因此,V表示为正负无穷大。

现在我们重新回到开头的第一道例题:>

#include <stdio.h>

int main() 
{
	int n = 9; 
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n); 
	printf("*pFloat的值为:%f\n", *pFloat);

	*pFloat = 9.0; 
	printf("num的值为:%d\n", n); 
	printf("*pFloat的值为:%f\n", *pFloat); 
	return 0;
}

在这里插入图片描述

再看一下第二部分:>

在这里插入图片描述

以浮点数的形式将n改成了9.0,那么9.0的二进制表示为:>

1001.0即1.001*2^3 那么S = 0; E = 3 + 127 = 130; M = 0.001.即

0 1000 0010 00100000000000000000000

因此以整数的形式来看,这个数据为:>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lw2C6Cbn-1638165164585)(C:\Users\MSI-NB\AppData\Roaming\Typora\typora-user-images\image-20211129090318437.png)]

以浮点数的形式来看, 当然是9.0了。

标签:存储,浮点数,内存,127,pFloat,9.0,关于
来源: https://blog.csdn.net/LIn_jt/article/details/121608192

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有