前提知识
我的实验平台是x86_64的Ubuntu
本文涉及到计算机字节的大小端表示
大小端
假设有一个int变量的值是0x01000002,它在内存中的起始位置是0x00000000
我们称0x01000002,右边是低位,左边是高位
那么大端字节序的存储结构是这样的,上面一行是地址,下面一行是值
小端字节序的存储结构是这样的
也就是,当计算机采用小端字节序的时候,要从高地址(0x00000003)往低地址(0x00000000)读才能读出正确的值0x01000002
而采用大端字节序的时候,要从低地址往高地址读。换而言之,小端存储是,低地址保存的是整数的低位(这里的低位是指02开始,到高位01);大端存储时,低地址存储的是整数的高位。
union
平常用的比较多的结构是C的struct,但是C还有一个结构叫做union,最开始是为了节约内存而设计的结构,当然还有更小的结构叫做Bit Filed,这些类型会在这篇文章详细介绍:https://blog.youkuaiyun.com/hhmy77/article/details/104114080
C中union有一个特点,联合(union)变量的所有成员共享同一块存储区/内存,因此联合变量每个时刻里只能保存它的某一个成员的值。就是因为这个特点,union的长度就是它最大变量的长度。
解答
我们利用这个特点可以写出以下代码
#include<stdio.h>
int main()
{
union{
char c;
int a;
}s;
s.a=0x01000002;
printf("%X\n",s.c);
}
s的长度是4个字节,也就是最大成员a的长度,这一点可以用sizeof去验证。
然后我们赋值给s.a令它的值是0x010000002,此时union的内存地址中只存有s.a的值,s.c并没有赋值,但是s.c和s.a的起始地址是一样的
我们用printf以16进制的格式输出s.c,这个时候就是s的起始地址的第一个字节的内容,在我的平台上输出结果是2,表示低地址存的是整数值的低位,那么我的平台字节序是小端表示的。
参考资料
https://blog.youkuaiyun.com/humanking7/article/details/81057648