位域:允许把一个字节拆开来使用,把一个字节的二进制位划分成不同的区域,并支持命名
使用位域的做法是在结构体定义时,在结构体成员后面使用冒号和数字来表示该成员所占的位数
位域的宽度不能超过它所依附类型的长度
位域成员可以没有名称,只要给出数据类型和位宽即可
不能对位域进行取址运算
如:
struct Test
{
unsigned int a:1;
unsigned int b:1;
unsigned int c:2; //对于无符号整型,最大只能为32(位宽)
unsigned int :3;
}
C语言并没有规定一个字节的尺寸:“可寻址的数据存储单位,其尺寸必须可以容纳运行环境的基本字符集的任何成员”
虽然C语言没有规定具体数据类型的位数,但编译器对各数据类型都明确定义了位数,若环境改变,定义也可能会变(<limits.h>)
位操作
逻辑位运算符:~ 按位取反,& 按位与,^ 按位异或,| 按位或(优先级从左至右依次降低)
上述操作符除按位取反外,其他三个符号都可以跟赋值号即=号结合到一块,使代码更加简洁
移位运算符: 11001010 << 2 将11001010左移2位 11001010 >> 2 移位效率很高
左移、右移运算符右边的操作数如果是为负数,或者右边的操作数大于左边操作数支持的最大宽度,那么表达式的结果均是属于“未定义行为”
应用:1.确认位 掩码按位与运算 2.打开位 掩码按位或运算 3.关闭位 掩码按位取反并异或运算 4.转置位 掩码异或运算