数据存储时的大小端解析

文章介绍了大小端存储的概念,大端模式是高位字节存低地址,低位字节存高地址,而小端模式则相反。通过代码示例展示了如何判断编译器采用的是大端还是小端模式,强调了大小端模式取决于硬件。
摘要由CSDN通过智能技术生成

首先大小端存储指的对象是单个数据在内存中存储时的模式。

目录

了解大小端

代码举例

 为什么会有大小端

设计代码判读你的编译器是啥端


 

了解大小端

大端(模式)存储:指的是数据在内存中存储时,保证数据的低位字节处保存在内存的高地址处, 数据的高字节处保存在内存的低地址处。

小端(模式)存储:恰恰于大端相反,数据的低字节处保存在内存的低地址处,数据的高字节处保存在内存的高地址处。

代码举例

#include<stdio.h>
int main()
{
	int a = 10;//存储一个整型,占4个字节
	//00000000 00000000 00000000 00001010	——10的二进制
	//整数以二进制补码存储在内存中,但为了便于观察,故用十六进制代替
	//四个二进制可以转换成一个十六进制
	//0x 0000 0000 0000 000a			——10的十六进制(前面的0x表示十六进制)
	//   高字节——————>低字节

	return 0;
}

我们用 VS2022 调试看一下内存存储:

16933bf7d0514c08b8535e283bfa03d9.png

 从编译数据中我们就知道:整型 a 占4个字节,存储在内存中用十六进制展示,存储模式按照着低位字节数据存放在内存的低地址处,高位字节数据存放在内存的高地址处。

补充一点:a是整型,占四个字节,一个字节(内存单元)占一个地址,&a拿出来的是内存中的低地址。

 为什么会有大小端

在计算机系统中,我们以字节为单位,每个地址单元都对应着一个字节(8 bit)但计算机中不仅仅是只有一个char类型还有大于一个字节的类型(short int long...)例如16位或32位处理器,由于寄存器的宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大小端存储模式。

例如:一个16 bit 的 short 类型x,在内存中地址为 0x0010,x的数值转换成十六进制是0x1122,那么 0x11 为高字节,0x22 为低字节。对于大端模式下将 0x11放在内存低地址(0x0010),那么0x22不就放在内存高地址(0x0011)咯。而小端模式巧合相反。我们常用的 x86 是小端模式,而KIEL C51 则为大端模式。很多ARP DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。说了那么多就一句:大小端取决于硬件

设计代码判读你的编译器是啥端

思路:首先我们想要判断大小端,那么我们必须了解大小端的区别是什么?                                 :单个数据在内存的存储顺序           (那么我们就可以以此为突破口)

实操:

#include<stdio.h>
int main()
{
	int a = 1;
	//00 00 00 01	-———十六进制
	char* p = (char*)&a;//强制类型转换&a为char*类型以便拿到低地址字节

	//如果是大端:拿低位地址就是a的高字节数据0
	//如果是小端:拿低位地址就是a的低字节数据1
	if (*p == 1)
		printf("小端");
	else
		printf("大端");

	return 0;
}

 简化:

#include<stdio.h>
int Check(int x)
{	
	return *(char*)&x;//强制类型转换为char*,返回低地址数据
}
int main()
{
	int a = 1;
	if (Check(a) == 1)
		printf("小端");
	else
		printf("大端");

	return 0;
}

其实简化的地方就一点:char* p=(char*)&a;    *p=*(char*)&a;

                                      

                                                                          

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CR0712

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值