admin管理员组文章数量:1794759
C语言两种方法求证大小端存储
什么是大小端存储?
大致的理解就是数据在内存中存储字节序的顺序·。
字节序的概念:
是以字节为单位,讨论存储顺序的。
小端字节序存储:
把一个数据的低位字节的内容放到低地址处,把一个数据的高位字节的内容放到高地址处。
大端字节序存储:
把一个数据的低位字节的内容放到高地址处,把一个数据的高位字节的内容放到低地址处。
什么是低位字节、高位字节?
比如一个整数123,个位数3就是低位,百位数1就是高位。
低位字节也同理,比如一个十六进制0x11223344,11就是高位字节,44就是低位字节。
画个图理解一下
记忆技巧:
在文字层面上,大端字节序存储是倒着存的,因为低位字节放到了高地址处,高位字节的内容放在了低地址处,文字层面上理解是倒着存。
在形式层面,小段字节序是倒着存,因为本来数据0x11223344,我们从小端存储模式拿出来却是0x44332211,这样看从形式上就是倒着存的。
但一般而言我们直接看形式,因为形式上更直接,看到在形式上是倒着存的,那么就是小端存储。
C语言求证大小端存储
法一:
我们假设有一个整型1,在内存中按照字节序的存储就是 00 00 00 01,我们只需要知道存在低地址中的到底是00 还是 01,这是一个字节的内容,而访问一个字节的内容,需要用到char*
所以我们直接将这个整型强制类型转换为char,然后取地址访问第一个字节的内容,即可知道大小端存储的顺序。
源码:
代码语言:javascript代码运行次数:0运行复制int main()
{
int i = 1;
int ret = *((char*)&i);
if (ret)
printf("是小端存储");
else
printf("是大端存储");
return 0;
}
法二:
利用联合体的性质,联合体内部成员变量共用同一块空间,那我们还是那个思路先定义整型1,然后定义一个char类型,因为共用同一块空间,所以直接访问char类型,看是1还是0即可判断。
源码:
代码语言:javascript代码运行次数: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,就可以判断出来大小端存储。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-07-20,如有侵权请联系 cloudcommunity@tencent 删除数据源码存储技巧内存本文标签: C语言两种方法求证大小端存储
版权声明:本文标题:C语言两种方法求证大小端存储 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754812023a1706761.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论