整数和浮点数在内存中的存储

当我们在学习计算机知识的时候,我们总会思考一个问题就是计算机的内存里是怎么存储数据的?浮点数和整数的存储形式一样吗?如果不一样那又有什么区别呢?今天我们就讨论一下整数和浮点数在内存的存储。

一、整数在内存中的存储

计算机内存中存储整数是以整数的二进制补码形式存储的。那么什么原码反码补码呢?

1.正数的原反补

原码就是我们将一个十进制整数转换成二进制所得得数,即:
正数的原码表示
这里我们将int a=5;(正数5)转化为二进制后得到了它的原码,那么反码和补码呢?当我们遇到正数的时候,它的原反补码是相同的,即:
在这里插入图片描述

2.负数的原反补

我们刚刚说到了正数的原反补码相同,那么负数的原反补又是怎么样的呢?
我们规定负数的最高位表示符号位,其余位表示数值位。即:
负数的原反补,梁梦楠做QAQ
所以正数和负数的原反补还是有很大的区别的。

二、大小端字节序

讲到大小端字节序,大家都一头雾水,其实最初我在了解的时候也是一头雾水,我甚至不知道为什么会存在,但是本着存在即合理,我们依然要学习。
大小端字节序,是指字节在内存中存的顺序。注意它的单位是字节!

我们的内存可以存各种各样的数据,那么他是以什么顺序存的呢?接下来我给大家举几个例子看看吧。
假如我要把int a=123;存放在内存中,**那么123哪个是低字节哪个是高字节呢?很显然1是高字节,3是低字节。因为在权重中1最高,而3最低。**那么我们现在分清楚了高字节和低字节,我们就看存储方式吧。
在这里插入图片描述
在内存在我们可以有以上几种存储方式,你可能觉得有些不合理,看着很变扭,所以就有大小端存在,像第二和第四种可以存储,但是要怎么从内存中拿出来才能是123呢?很难实现,所以我们就第一个和第三个,要么我正着取出,要么我倒着取出。

1.大端字节序

**大端字节序指将一个数值的低字节存入高地址处,将高字节存入低地址处。**即:
在这里插入图片描述

2.小端字节序

小端字节序是指将一个数值的低字节存放低地址处,高字节存放到高地址处。
在这里插入图片描述

3.如何判断大小端字节序呢?

Vs2022是小端字节序。
我们看上面的例图发现44的位置不一样,那么我们只需要定义一个int a=1;如果我取第一个字节是1的话,那么他就是小端字节序,如果是0的话,就是大端字节序。

#include<stdio.h>
int check_sys()
{
	int a = 1;
	if ((char)a)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	if (check_sys())
	{
		printf("小端");
	}
	else
	{
		printf("大端");
	}
	return 0;
}

由此可以VS是用的小端字节序。
在这里插入图片描述

三、浮点数在内存中的存储

1.浮点数的存

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

在这里插入图片描述
S可以控制小数的正负,即:s=0时表示正数,s=1表示负数。
M是表示有效的数字,M是大于等于1且小于2的数。
2的E次方表示指数。
例子:
在这里插入图片描述

那么内存中就是这样存储的吗?不不不,这只是一种表示形式,下面是真正存储在内存中的样子在这里插入图片描述
在32位下是这样存储的,那么具体内容是什么呢?那么就要以下规定来要求了。
转换规定:
M:只存小数点后面的数,如果要从内存拿出再加上前面的1即可。
E:表示无符号数,E的真实值加一个中间是32位+127,64位+1023。
在这里插入图片描述

2.浮点数从内存中拿取

主要是在E的位置有区别:

①.E不全为1/0

这就是我们上面的例子那样,E不全为1或者0

②.E全为0或全为1

E如果全为0,那么真实的E=-127,那么这个时候有效值我们就不在加1,改为0.xxxxxxx形式即可。

以上就是我关于正数和浮点数在内存中的存储t讨论,有许多地方可能没有说到,欢迎大家来评论区补充,感谢收看。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值