联合(union)变量的所有成员共享同片存储区/内存。因此联合变量每个时刻里只能保存它的某一个成员的值。
union的主要特征有:
union中可以定义多个成员,union的大小由最大的成员的大小决定;
union成员共享同一块大小的内存,一次只能使用其中的一个成员;
对union某一个成员赋值,会覆盖其他成员的值(但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节);
union量的存放顺序是所有成员都从低地址开始存放的。
因此,可以用联合(union)来判断CPU的大小端(印第安序):
1 int checkCPU()
2 {
3 union w
4 {
5 int a;
6 char b;
7 }c;
8
9 c.a = 1;
10
11 return ( c.b == 1 );
12 }
同样的道理,在Linux中给出了更加精练的实现。如果宏ENDIANNESS=‘l’表示系统为little endian, 为‘b’表示big endian。
1 static union
2 {
3 char c[4];
4 unsigned long l;
5 }endian_test = { {‘l’,’?’,’?’,‘b’} };
6
7 #define ENDIANNESS ( (char)endian_test.l )
转自于
1412

被折叠的 条评论
为什么被折叠?



