写的原因:
1.更加详细的介绍,对初学者的指导。
2.记录自己生活。
内容:
C语言是一个非常灵活的语言,虽然它是面向过程的语言,但是可以定义结构,定义自己的类型。上可以进行接近面向对象,下可以达到硬件的汇编。不说这些了。
首先,要想使用c语言的位域结果,必须了解unsigned类型,它是无符号类型,并且是按位存贮的。所以全部存贮的是0,1。
其次,了解运算符。语言提供了六种位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
至于这些运算规则,我就不啰嗦了。参考C语言教科书。
下面来看位段结构:
位段结构也是一种数据结构,只不过其中含有以为为单位定义存贮长度的整数类型的位段成员。
定义方法:
struct bytedata
{
unsigned a:2;//位段a
unsigned b:2;
unsigned :2;//无名位,不能访问,为什么要设置,下面介绍
unsigned :0;//标识下一字段从下一字边界开始
int i;//成员i
}data;
为什么要设置无名段:由于每一个位段不能超过C语言版本的字长,当作填充用。
什么是字边界:即以C语言版本的字长为单位,下一字长的开始位置。
应该注意一下几点:
1.位段长度不能超过存贮单元(字长)。
2.可以定义无名段。
3.可以定义:0,设置从下一字长开始。
4.不能进行取地址运算。
5.位段可以使用%d,%c,%x输出。
6.在表达式中是整数。
7.应用像结构体一样进行引用。
8.前面是地位后面是高位。
9.位段支持所有的位操作。
现在已经说的很明白了。
简单的附一个赋值代码:
#include"stdio.h"
typedef struct Test
{
unsigned char b0:8;
unsigned char b1:8;
unsigned char b2:8;
unsigned char b3:8;
}BTest;
void main()
{
BTest c,d,e;
c.b0=1;
c.b1=2;
c.b2=3;
c.b3=4;
d.b0=0;
d.b1=1;
d.b2=2;
d.b3=3;
e.b0=c.b0^d.b0;
printf("%d%d%d",c.b0,c.b1,e.b0);
}