1.整型在内存中的存储方式
1.1原码、补码和反码的介绍
数据在内存中是以二进制的形式存储的,应为机器语言是能识别二进制。谈到整型数据在内存只能的存储,我们就不得不提到原码、补码、反码。下面我将介绍一下原码、补码和反码。
原码:直接将数值按正常正负数的形式翻译为二进制的形式。
反码:在原码的基础上,除了符号位不变,其他位按位取反。
补码:反码+1。
这三种表示方式都是由符号位和数值位组成的,符号位在二进制数的最左边,0代表数为整数,1代表该数为负数。
为什么要使用原码、反码、补码呢?当然是这种方式方便存储和运算了,我们的计算机只有加法运算器,那我们如何实现减法,这种存储方法就可以实现减法。这种计算的方法其实和我们的时钟很相似。例如:六点到九点可以逆时针转三个点,也可以顺时针转九个点。具体如何实现,可以去找相关的文章,这里就不具体描述了。
对于整型来说:数据是以二进制补码的形式存入内存的。
2.大小端字节序和字节序判断
2.1什么是大小端
上面我们知道了,整型数据是以什么形式存储的,那数据是以什么顺序存储的呢?
改图是变量a在内存之中的存储情况,注意:这里是十六进制是因为要方便我们观看,在内存中的实际情况是二进制。数值的二进制是101000001001100111110,该二进制转化为十六进制就是14133e。我们可以发现,实际存储的顺序是不是和我们求得是顺序相反,这里大小端的讨论的是字节顺序,是以字节为最小单位。在数据之中有低位字节和高位字节之分,例如:我们上面的14133e,这个数据的地位字节其实是3e,那高位字节是14吗?不对,这个数据是一个int类型的数据,它是有4个字节的,所以高位字节是00。我们的内存是被以一个字节为单位来进行划分的,在内存中存在低地址和高地址之分。如果我们将小端字节放在低地址中,我们就叫做小端存储;如果将小端存储放在高地址,就叫做大端存储,这个大小端是由编译器决定的。
2.2如何判断大小端的字节序
第一种方法:开启调试,在内存窗口中,输入地址,就可以查看对应整型数据在内存中的存储,如上图,之间判断。
第二种方法:使用相应的程序代码,进行判断。
#include<stdio.h>
int check_sys()
{
int i = 1;
return (*(char*)&i); //强行将指针类型转换,只能取一个字节
//大端返回的是0;小端返回的是1
}
int main()
{
int ret; //用来接受返回值
ret = check_sys();
if (ret == 1)
{
printf("是小端存储\n");
}
else
{
printf("是大端存储\n");
}
return 0;
}
上述代码能够判断编译器的大小端。
3.浮点数在内存中的存储
3.1浮点数和整数的存储不同
我们知道int类型和float类型,在内存中都只占4个字节,但是float取值的范围却比int类型大得多,这是因为它们两在内存中的存储方式不同。
3.2.浮点数的存储
任意浮点数可以表示为一下的形式:
下面就看看这个标准式是什么意思,首先我们要将十进制的浮点数转化为二进制的浮点数,其实转化也很简单,就是分别将小数点前面和小数点后面转为二进制,但是二者的转化的方式不同。举个例子:5.0写成二进制形式是101.0,然后化为标准式(-1)^0*1.010*2^2,这个标准式中的S为0,M为1.010,E为2.
3.2.1浮点数的实际储存过程
在实际的存储中,我们还对 E和M有一些别的要求。
M的形式为1.xxxxx,我们不难发现,无论那个浮点数的M首位都是1,因此我们可以省略这个1,直接将小数点后面的二进制存入内存。用float来举例子,看似我们储存了23位,实际上我们储存了24位,只不过我们并没有显示这个1.
E要是一个无符号的整数,但是在实际情况中我们的小数点,是会出现向左移还是向右移的情况,E的实际取值是会取大负数的,因此我们就是要在E的真实值上加上一个中间值,使它恒为正,对于8位的E,中间值是127;对于11位的E中间值是1023。
3.2.2浮点数读取时的过程
我们如何将浮点数存入内存,那么那么在读取的时候就原路返回,按照我们的标准将原本的数组取回来。但是根据E的取值情况我们分为,我们有三种不同的取法
E不全为0和不全为1:符号位,按照S的取值情况0为正,1为负。E减去127(八位的情况),M在小数点前面补上1。
E为全0:说明小数点向后偏移了许多位,这说明这个浮点数非常的小。那么这是我们就定义E=1-127,同时有效数字M也不在不上小数前面的1,而是补上0.这样是为了表示正负0,以及很接近0的数字。
E为全1:说明小数点向前偏移了许多位,说明这个浮点数非常大。如果这这是有效数字M为全0,那么就表示正负无穷大(正负看S的取值)
总结:
希望看完这一篇,你能够理解整数和浮点数在内存中存储的差异,以及他们是如何存储的,如果上述文章中有错讲、误讲,请在评论区下或者私信联系我,谢谢指正错误。