答案是B,B,可我的编译器第一空是12345678,第二空不知道怎么求出来的

img

你这个书里应该int占2字节,long占4字节,无符号char永远是1字节
所以数据会按照long对齐,也就是

字节1字节2字节3字节4
78563412

long的值是字节1到字节4
int的值是字节1到字节2
char的值是字节1

这个题目到处都是UB和平台定义行为,没有深究的意义。
第一:机器是小端序还是大端序?C没有定义。
第二:int和long是多长?C标准只规定了最小长度。
第三:对m.b进行初始化,却对m.a和m.c试图读取,虽然听起来不可思议,但这也是UB。
令人欣慰的是这个题目没有出现常出现的char符号UB。
上面说“计算机是小端序存储”,严格来讲这个说法是错误的,大端序机器也有,甚至存在一些既不是大端序也不是小端序的机器,例如PDP-7。

首先确定下你的运行环境是多少位的,书本上这种情况看起来,long是32位,int 是16位,所以,m.a = 0x5678(2个字节)。

至于为什么是0x5678而不是0x1234?

0x12345678在内存中是倒序(低端字节序)存放的,也就是 78 56 34 12 ,所以当取2个字节的时候,以m结构体的地址为起点,向后读2个字节,就是78 56,反应到程序中就是0x5678