C语言联合体内存布局与字节序详解 - u.a[0] 为什么是低字节内容
C语言联合体内存布局与字节序详解 - u.a[0] 为什么是低字节内容
在C语言中,联合体(union)的所有成员共享相同的内存空间,所以通过修改其中一个成员的值,会影响到其他成员。本文将深入解析联合体内存布局,并结合x86架构的小端字节序(Little Endian)解释为什么在联合体中,u.a[0] 代表低字节内容。
#include<stdio.h>
int main(int argc, char const *argv[])
{
union{
short i;
char a[2];
}u;
u.a[0] = 0x11;
u.a[1] = 0x22;
printf("0x%x\n", u.i);
return 0;
}
在这个例子中,联合体u有两个成员:一个short类型的整数i和一个char类型的数组a,数组a有两个元素,分别表示低字节和高字节。
在内存中,联合体u的内存布局如下:
-------------------------
| |
| i |
| |
| a[0] |
| a[1] |
-------------------------
由于x86架构是小端字节序(Little Endian),低字节存储在低地址,高字节存储在高地址。所以当我们将0x11赋值给u.a[0]时,它会存储在低地址,即u.i的低字节部分。
所以最后输出的结果是0x2211,因为0x22存储在高字节部分,0x11存储在低字节部分。
原文地址: https://www.cveoy.top/t/topic/qiqt 著作权归作者所有。请勿转载和采集!