C语言两种方法求证大小端存储

目录

什么是大小端存储?

字节序的概念:

小端字节序存储:

大端字节序存储:

什么是低位字节、高位字节?

 记忆技巧:

C语言求证大小端存储

法一:

法二:

总结:

什么是大小端存储?

大致的理解就是数据在内存中存储字节序的顺序·。

字节序的概念:

是以字节为单位,讨论存储顺序的。

小端字节序存储:

把一个数据的低位字节的内容放到低地址处,把一个数据的高位字节的内容放到高地址处。

大端字节序存储:

把一个数据的低位字节的内容放到高地址处,把一个数据的高位字节的内容放到低地址处。

什么是低位字节、高位字节?

比如一个整数123,个位数3就是低位,百位数1就是高位。

低位字节也同理,比如一个十六进制0x11223344,11就是高位字节,44就是低位字节。

画个图理解一下

 记忆技巧:

在文字层面上,大端字节序存储是倒着存的,因为低位字节放到了高地址处,高位字节的内容放在了低地址处,文字层面上理解是倒着存。

在形式层面,小段字节序是倒着存,因为本来数据0x11223344,我们从小端存储模式拿出来却是0x44332211,这样看从形式上就是倒着存的。

但一般而言我们直接看形式,因为形式上更直接,看到在形式上是倒着存的,那么就是小端存储。

C语言求证大小端存储

法一:

我们假设有一个整型1,在内存中按照字节序的存储就是 00 00 00 01,我们只需要知道存在低地址中的到底是00 还是 01,这是一个字节的内容,而访问一个字节的内容,需要用到char*

所以我们直接将这个整型强制类型转换为char,然后取地址访问第一个字节的内容,即可知道大小端存储的顺序。

源码:

int main()
{
	int i = 1;
	int ret = *((char*)&i);
	if (ret)
		printf("是小端存储");
	else
		printf("是大端存储");
	return 0;
}

法二:

利用联合体的性质,联合体内部成员变量共用同一块空间,那我们还是那个思路先定义整型1,然后定义一个char类型,因为共用同一块空间,所以直接访问char类型,看是1还是0即可判断。

源码:

union un
{
	int i;
	char a;
};

int main()
{
	union un a = { 0 };
	a.i = 1;
	if (a.a == 1)
	{
		printf("小端存储");
	}
	else
	{
		printf("大端存储");
	}
	return 0;
}

总结:

上面的两种方法底层逻辑是一样的,都是想从定义整型1的4个字节内容里面访问第一个字节的内容,看是不是1,就可以判断出来大小端存储。

猜你喜欢

转载自blog.csdn.net/hanwangyyds/article/details/131832394
今日推荐