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存储在低字节部分。

C语言联合体内存布局与字节序详解 -  u.a[0] 为什么是低字节内容

原文地址: https://www.cveoy.top/t/topic/qiqt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录