C语言—数据在内存中的存储

我们今天以整型来叙述,常见的整型有int(4个字节)、short(2个字节)、long(在32位下4个字节)、long long (8个字节)。首先我们说明32位与64位的区别。32位代表有32个地址线,也就是可以处理2的32次方那么大的数字。表示内存共有2^32个地址。每一个地址可以存储一个字节。所以32位系统最大可支持的内存大小=2的32次方/1024/1024=4096MB 就等于4GB


在我们内存地址之中,是用16进制存储的,0-15前9个数为0-9,从10-15分别为a,b,c,d,e,f 。我们都知道一个字节由八个二进制位构成,所以一个整型是4个字节由32个二进制位构成,1个字节等于8个二进制位。 f是在二进制位下的1111,由此我们可知道2个16进制位等于1个字节。


我们把a和b的地址存储到内存之中(这里我们用的编译器是VS2019),来思考在内存之中是不是随机分配的

int a = 0x11223344;
int b = 0x22334455;

在这里插入图片描述

这里我们发现,似乎a的地址是反着存储的,我们明明给的a是11223344,这是为什么呢。
首先我们要知道什么是低位和高位。
例如一个十进制数字123 3就是低位 1就是他的高位
再例如一个字节的二进制位 1000 0001 最左边的1就是高位 右边的1就是低位


在想探讨这些之前我们还得知道什么是小端存储和大端存储。
小端存储模式:数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。
大端存储模式:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。

由我们上面的图发现不仅a的地址是连续被存储进去的,而且低位44正好存放在最低的地址当中,由此我们能知道vs2019是一个小端存储的模式。


在这里插入图片描述
而我们b的地址也是证实了是用小端存储的模式,而我们还发现b的起始地址(0x00EFFDAC)比a的起始地址(0x00EFFDB8)还要低。所以我们在定义一个变量的时候,内存是会优先使用高地址。


这里我们有一道例题

请简述大端字节存储和小端字节存储的概念,设计一个小程序来判断当前机器的存储。

这里我们的思路是我们假设为a开辟的字节地址是0x11223344
在这里插入图片描述
我们只对比第一个字节,如果我们拿出来发现是44那么就证明是小端字节存储,拿出来11那么就是大端存储。

所以我们的思路是定义一个int a = 1
在这里插入图片描述
拿出来第一个是01那么就证明是小端存储,00那么就是大端存储。所以我们只需要拿出第一个字节就行,

代码如下:

int check_sys()  //判断大小端
{
	int a = 1;
	char* p = (char*)&a;

	if (*p == 1)
		return 1;
	else
		return 0;
}
int main()
{
	if (check_sys() == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

总结
1.在定义局部变量时候内存是优先使用高地址再使用低地址
2.在Visual Studio编译环境下,当一个变量获得一块内存空间后,变量的低位从内存的低地址开始存储(小端字存储)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C语言,局部变量和函数参数等数据通常存储在栈空间。栈空间是一种自动管理的内存区域,用于存储函数的局部变量和函数调用的相关信息。 当一个函数被调用时,它的局部变量和函数参数被分配到栈空间。栈空间的分配和释放是由编译器自动完成的,遵循"后进先出"(Last-In-First-Out, LIFO)的原则。 在栈空间,局部变量的存储是通过栈指针(SP)进行的。栈指针指向当前栈顶的位置,新的局部变量被分配在栈顶,并且栈指针向下移动。当函数调用结束后,栈指针会回退到之前的位置,之前的局部变量所占用的空间就可以被重新使用。 要存储和读取栈空间数据,可以直接使用变量名来进行操作。例如,以下是一个示例函数,展示了如何存储和读取栈空间数据: ```c void exampleFunction() { int x = 10; // 在栈空间分配一个整型变量x int y = 20; // 在栈空间分配一个整型变量y int z = x + y; // 通过操作栈空间的x和y计算z的值 printf("z = %d\n", z); // 输出z的值 } ``` 在这个示例函数,变量`x`和`y`被分配到栈空间,它们可以通过变量名直接进行操作和计算。最后,通过`printf`函数将计算得到的结果输出。 需要注意的是,栈空间数据只在函数执行期间有效。当函数执行结束后,栈空间数据将被销毁,并且不能再访问这些数据。因此,栈空间主要用于存储函数调用期间所需的临时数据和局部变量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值