数据在内存中的存储(C语言)

数据在内存中的存储(C语言)

Ⅰ 整型在内存中的存储

在讲解整型在内存中的存储之前,带大家了解一下:

🎄二进制位:**逢二进一**🎄

整数的二进制表示方法:原码、反码、补码

十进制位就是平常我们常见的数字:1000、100、10、1等,这些都是十进制表示方法。

在一个整数进行存储时,会将整数的十进制转换成二进制位,而最后在电脑内存储的是整数二进制的补码,有人好奇就问了什么是原码、反码、补码?

1. 原码、反码、补码的讲解

接下来就给大家讲解一下什么是原码、反码、补码。

三种表示方法均有符号位和数值位:

符号位为 0 表示正数,符号位为 1 表示负数。

最高位是符号位,其他位就是数值位

正数的符号

注意:正数的原、反、补码是相同的

如下图所示:

在这里插入图片描述

负数的原、反、补码是根据一下规律得到

原码:直接将数值按照二进制位得到的就是原码。

反码:是原码的符号位不变其它位按位取反得到反码

补码:反码加1得到补码

如下图所示:
在这里插入图片描述

对于整形来说:数据存放内存中其实存放的是补码。

为什么在计算机中存放的是补码呢?

原因:主要是使用补码,可以将符号位和数值位进行统一处理,而计算机当中(CPU只有加法器)加法和减法会进行同一处理,此外,补码与原码相互转换,其运算过程是 相同的,不需要额外的硬件电路。

Ⅱ大小端字节序和字节判断

当我们知道整数在内存中的存储后,我们来调试一下代码:

int main()
{
	int a=0x11223344;
	return 0;
}

如下图所示
在这里插入图片描述

调试后发现 a 在计算机中存储的字节顺序是倒着存储的。这是为什么呢?

2. 计算机中的大小端系统

有人好奇就会问了,什么是大小端?

在计算机当中,有超过的一个字节的存储时,会跟据电脑系统的存储有关,大小端的存储就是两种顺序的不同而已。

大端(存储)模式:大端存储方式是将数据低字节存储到计算机内存的高地址位,而数据的高字节位存储到计算机中的低地址位。

小端(存储)模式;小端存储方式是将数据高字节存储到计算机内存的高地址位,而数据的低字节位存储到计算机中的低地址位。

规律

内存条的地址高低位置如下图所示
在这里插入图片描述

字节的高低位置如下图所示

在这里插入图片描述

小端: 高高低低

大端:低高低高

Ⅲ 浮点类型在内存中的存储

请看以下代码

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

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

请问一下代码输出结果是什么?

代码结果

在这里插入图片描述

为什么会输出以下结果呢?

很好奇是吧,这是因为浮点型的存储方式跟整型不一样。

3.1 浮点类型的存储

根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:

V = (−1)s ∗ M ∗ 2E

🔻( (−1)^s)表示的是符号位,S=0,是正数。当S=1时,时负数。

🔻 M表示有效数字,M总是大于等于1小于2的。

🔻 **2E**表示指数位

例子

比如十进制的5.0,二进制表示位是101.0,相当于1.01×22

按照上面V的形式:可以得出S=0;M=1.01;E=2。

⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×22 。那么,S=1,M=1.01,E=2。

IEEE 754规定:

对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M

对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
在这里插入图片描述

在这里插入图片描述

3.2 浮点类型的存储的过程

IEEE 754对有效数字M和指数E,还有⼀些特别规定。

有效数字M的存储过程

前面已经说过,M的取值 1≤M<2,M可以写成 1.xxxxxx的形式,其中xxxxxx是小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,比如前面M=1.01,只保存01,而当读取数据时,计算机会自动把1给添加回去。这样做的⽬ 的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保 存24位有效数字。

指数E的存储过程

首先指数E是一个位无符号整数。如果E为8位,它的取值范围为0~255 ;如果E为11位,它的取值范围为0~2047。但是,我们知道科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,27的E是7,所以保存成32位浮点数时,必须保存成7+127=134,即1000 0110。

3.3 浮点类型的读取的过程

指数E的读取分三种情况:

指数E不全为0或不全为1的情况:浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第⼀位的1。

指数E的全为0的情况:这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

指数E的全为1的情况:如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)。

一开始的代码解析:

在这里插入图片描述

所以代码第6行输出的是0.000000。

再看看浮点数9.0,为什么整数打印是 1091567616 。

首先9.0的二进制可以写成1001.0,即换算成科学计数法是:1.001×2^3

得到S=0;M=1.001;E=3,所以: 9.0 = (−1) ∗ 0 (1.001) ∗ 23 。

在这里插入图片描述

以上就是本篇文章的全部内容,希望各位看官点点赞。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值