首先你要知道编译器给union的分配的内存空间是按占最大空间的变量决定,其他成员都是共享这段内存。
你的union中long b最大,int a和uchar c是共享这块内存;
所以给b赋值,自然a和c也分别有值了。
int占4个字节,所以是0x12345678,而c占一个字节,则是0x78
TIP:0x12 34 56 78是四个字节
而且根据你这个C输出结果来看你的系统应该是小端模式(比如X86),若是在ARM等处理器的环境下你的C输出估计是0x12,这个你以后学习socket编程的时候,肯定要了解的一个知识点(详细可以搜索一下大端模式与小端模式)
这个是字节序的问题,在X86(PC)机上,字节序是小序,也就是说,小位数放在前面,大位数放在后面,m的内存布局为:
0x0012FF54 78 56 34 12
所以m.c当读取其中一个字节时,读出来是0x78.
你可以使用VC,看一下m的内存。
m是联合体,a(4byte),b(4byte),c(1byte) 所以m占用4byte
a和b是同块内存,所以a会等于b
c是占用的是低字节的1byte
因为 unsigned char 数据类型为 8 为二进制数,既 2 位 16 进制数,所以只能截取最后的 0x78 。