你这个书里应该int占2字节,long占4字节,无符号char永远是1字节
所以数据会按照long对齐,也就是
字节1 | 字节2 | 字节3 | 字节4 |
---|---|---|---|
78 | 56 | 34 | 12 |
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