大小端存储的理解与判断方法

一,什么是大小端

计算机的数据存储方式 ,可以分为 大端存储(Big-Endian) ‌和‌小端存储(Little-Endian),不同的计算机内部采用的存储方式可能不同。

大端存储:低地址处存放 高位数据

小端存储:低地址处存放 低位数据

图例:
以小端存储为例:

1. 正常数字 1 (若为四字节)的十六进制表示 :0x 00 00 00 01 (其中 01 为最低位 ,从左往右 位数递增 )

2. 观察内存调试窗口,首先发现int a的内存数据 占用四个字节 ,具体分布是 01 00 00 00 ,

其中四个字节的地址和数据对应

A759AFFB34 01

A759AFFB35 00

​​​​​​​ ​​​​​​​A759AFFB36 00

A759AFFB37 00

便可以发现 01 作为 最低位 是 存储在 较低地址处 的 符合 小端存储

二 如何用代码判断

方法一:

将整形(int) 地址强转成 字符(char)类型 地址 ,此时 对 字符地址解引用 必定 得到 4个字节 的 首地址(低地址) 所存储的数据 ,如果为 1 则代表 低地址存储 的 为 01(小端) 否则 则存储的为 00(大端)

cpp 复制代码
#include <stdio.h>
int main()
{
	int a = 1;
	if (1 == *((char*)&a))
	{
		printf("小端存储");
	}
	else 
	{
		printf("大端存储");
	}
	return 0;
}

方法二:

运用联合体共享空间的特性

首先 KeyUn 的 总大小 为 4字节 (联合体的大小为 占用空间最大的 成员 的大小),KeyUn成员中 int a;的占用空间最大(4字节),所以 整体 KeyUn的 空间为 4 字节。

其中 char c也使用 int a对应的 相同4字节空间 ,但是没有对 c 进行赋值 ,所以 此时 查看 c的值 ,默认还是在 a 的 4 字节空间 中 的 首地址空间 取值 (即低地址处),如果为1则同理 为 小端存储。

cpp 复制代码
union UN
{
	int a;
	char c;
};
#include <stdio.h>
int main()
{
	union UN KeyUn;
	KeyUn.a = 1;
	if ((int)KeyUn.c == 1)
		printf("小端存储");
	else 
		printf("大端存储");

	return 0;
}
相关推荐
海清河晏1111 小时前
数据结构 | 单循环链表
数据结构·算法·链表
wuweijianlove5 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong5 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光6 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_116 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg6 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒6 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾6 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio