数据在内存中的存储,你get到了吗(芜湖~~)

(感谢各位大佬的点击,本人第一篇博客,后续会再接再厉的)

重点内容(先来瞅一瞅)

1.整形在内存中的存储:原码、反码、补码

2.大小端字节序介绍及判断

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_19,color_FFFFFF,t_70,g_se,x_16

1.整形在内存中的存储

一个变量本身的创建是要在内存中开辟空间的。空间的大小是根据本身类型决定的。

比如,大家都知道一个int类型的变量,自身被分配四个字节的空间。

但是其是如何在内存里面如何存储的?

下面我们来了解以下概念:

1.1原码、反码、补码

其内容简述,即计算机中的整数有三种表达方式,原码、反码、补码

此三种表达方式均有符号位数值位两部分的,符号位都是用0表示‘’,用1表示‘负’

数值位上,正整数其原,反,补码相同

负整数则有以下规律

原码

直接将二进制按照正负数的形式翻译成二进制就可以

反码

将原码的符号位不变,其他位依次按位取反即可

补码

在反码的基础末尾加一即可

 

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

为什么呢!!!

其原因在于,在计算机系统中,使用补码,可以将符号位和数值域统一处理:

同时,加法和减法也可以统一处理,CPU只有加法器,此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

下面代码展示

#include <stdio.h>

int main()
{
   int a=-10;
   int b=10;

   return 0;
}

eb9ba918d9394aa783c43bf505d24ace.png?x-oss-process=image,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_18,color_FFFFFF,t_70,g_se,x_16

7eafa07ccdd849e28d7844f0fbab212a.png?x-oss-process=image,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_18,color_FFFFFF,t_70,g_se,x_16

注:地址显示多以十六进制表示,其中越靠近0X 的 字节权值位越高,即数据的高位

de48267f98a04147bb3fafec80f93130.png?x-oss-process=image,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 (0X表示该地址是以十六进制显示)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_8,color_FFFFFF,t_70,g_se,x_16watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_10,color_FFFFFF,t_70,g_se,x_16

 

 此时我们可以很容易的观察到,存储的是补码不假,但是为什么顺序却有些奇怪呢?

1.2 大小端的介绍

 什么是大小端呢?

大端存储模式,即是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

小端存储模式,即是指数据的高位保存在内存的高地址中,而数据的低位,保存在内存的低地址中;(简称“小小小”,其中上述例子在VS2019环境下,便是小端存储显示)

补充:

字节序:CPU从内存中进行数据存储的顺序,以字节为单位;

主机的字节序取决与CPU架构;;例如X86--小端存储模式,MIPS--大端存储模式

 

 那么我们应当如何辨别是大端存储还是小段存储呢?

方式一:通过指针类型的强转,之后解引用,判断所取第一个字节内容

(补充:指针的类型,其实决定了指针从起始地址开始向后访问多少个字节;如char*,每次从起始地址访问一个字节单位)

void Endian()
{
	int tmp = 1;
	if (*(char*)(&tmp) == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
}
int  main()
{
	Endian();
	return 0;
}

方式二:利用联合体内存“共享”这一特性,在其内部元素起始地址相同,在通过不同类型,得知第一个字节内容(该方式实则为方式一的变形)

void Union()
{
	union
	{
		int m;
		char n;
	}un;
	un.m = 1;
	if (un.n == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
}
int  main()
{
	Union();
	return 0;
}

 

1.3 牛刀小试

练习一:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_20,color_FFFFFF,t_70,g_se,x_16

练习二:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

 

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值