共用体(联合体)
1、所有成员共用一块内存空间,且同一时刻只有一个成员有效
2、共用体所占内存大小=最大成员所占内存、
3、同样遵循内存对齐规则-->共用体所占内存大小,是成员最大类型的整数倍
定义形式:
union 共用体名
{
成员1;
成员2;
...;
};
枚举:枚举中存放的数据都是整数常量。
枚举定义形式:
enum 枚举名
{
枚举常量1,
枚举常量2,
....
枚举常量n
};
枚举规则:
1、枚举常量默认从0开始依次递增。
2、可以手动指定枚举常量的值,未指定的会沿用前一个值加1。
3、由于枚举中存放的都是常量,所以定义的枚举变量不可以使用成员运算符。
4、枚举中存放的数据都是整型常量。
举例:enum WeekDay{MON, TUE, WED, THU, FRI, SAT, SUN};
位运算:
&(按位与) |(按位或) ^(按位异或)
<<(左移) >>(右移)
~(按位取反)
1、&(按位与): 全1为1,否则为0
一个数 & 0 --> 清零
1234 & 0 --> 0
0100 1101 0010 1234
0000 0000 0000 & 0 &
------------------
0000 0000 0000
2、|(按位或):全0为0,否则为1
一个数 | 0 --> 不变
1234 | 0 --> 0
0100 1101 0010 1234
0000 0000 0000 | 0 |
------------------
0100 1101 0010
3、^(按位异或):相同为0,不同为1
a = 1234 | b = 4321 --> a = 4321、 b = 1234
a = a ^ b;
a 0000 0100 1101 0010 1234
b 0001 0000 1110 0001 ^ 4321
^ ------------------------
a 0001 0100 0011 0011
b = a ^ b;
a 0001 0100 0011 0011
b 0001 0000 1110 0001 ^
^ ------------------------
b 0000 0100 1101 0010
a = a ^ b;
a 0001 0100 0011 0011
b 0000 0100 1101 0010 ^
^ ------------------------
a 0001 0000 1110 0001
4、~(按位取反):0变1, 1变0
5、<<(左移)
每左移一位,相当于乘以2
0011 0101 << 1 --> 0110 1010
6、>>(右移)
每右移一位,相当于除以2
0110 1010 >> 1 --> 0011 0101
#include <stdio.h>
#include <string.h>#if 0
union Data
{int i;double f;char str[17];
};int main(int argc,char *argv[])
{// union Data 是类型,d是变量名union Data d;printf("%lu\n", sizeof(d));// 只有 i 成员有效d.i = 10;printf("%d, %f, %s\n", d.i, d.f, d.str);// 只有 f 成员有效d.f = 3.14;printf("%d, %f, %s\n", d.i, d.f, d.str);// 只有 str 成员有效strcpy(d.str, "abc");printf("%d, %f, %s\n", d.i, d.f, d.str);return 0;
}
#endif#if 1enum WeekDay{MON, TUE=10, WED, THU, FRI=10, SAT, SUN};int main()
{// 定义枚举变量// 当前变量只能被赋值,不可以使用成员运算符enum WeekDay t;t = SUN;printf("%d\n", t);return 0;
}#endif
练习1:
#include <stdio.h>
int main()
{
struct s1
{char ch, *ptr;union{short a, b;unsigned int c:2, d:1;};struct s1* next;};
return 0;
}
练习2:若int占2个字节,char占1个字节,float占4个字节,sizeof(xc)的大小是()
#include <stdio.h>
int main()
{
struct stu{union{char b[5]; // 5int bh[2]; // 4}cla; // 6char xm[8]; // 8float cj; // 4};
struct stu xc;
printf("%lu\n", sizeof(xc)); // 20return 0;
}