整型和浮点型在内存中的存储方式

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的取值)

总结:

  希望看完这一篇,你能够理解整数和浮点数在内存中存储的差异,以及他们是如何存储的,如果上述文章中有错讲、误讲,请在评论区下或者私信联系我,谢谢指正错误。

   

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值